Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.97.14.86] |
|
Страницы: (3) 1 [2] 3 все ( Перейти к последнему сообщению ) |
Сообщ.
#16
,
|
|
|
Оригинально, но громоздко! Имхо, можно заменить: Дата10ДнейНазад = глДобавитьДнейКДате(РабочаяДата(),-10); //на Дата10ДнейНазад = РабочаяДата() - 10; |
Сообщ.
#17
,
|
|
|
Эх. Хотите оригинальное решение? Получайте.
v7 Исходная задача: Нужно записать реквизит документа или справочника по ссылке или через контекст. Исследование предмета задачи: Ну при записи реквизита через ссылку все понятно, вопросы возникают при записи через переданный контекст самого элемента справочника или документа. Исследование показало, что при открытии на чтение объект базы на запись не блокируется, если же открыть на запись - блокируется. Даже если открыть объект на запись, а затем где-то в модуле формы будет вызвано Форма.ТолькоПросмотр(1), то блокировка на запись останется. Все логично. Решение: Приведенная мной функция может содержать глюки, т.к. она несколько отличается от оригинала в живой базе (там она заточена только для записи штрих-кода). // Записывает реквизит элемента справочника или документа. // При передаче контекста объект должен быть не модифицирован. // Возвращает 0 при успехе, -1 при ошибке. Функция глЗаписатьРеквизит(ОбъектИлиКонтекст,ИмяРеквизита,ЗначениеРеквизита) Экспорт ТипОбъекта=ТипЗначенияСтр(ОбъектИлиКонтекст); ПереданКонтекст=0; Если ТипОбъекта="ГрупповойКонтекст" Тогда ПереданКонтекст=1; Попытка // Считаем, что только у документа есть НомерДок НД=ОбъектИлиКонтекст.НомерДок; ТипОбъекта="Документ"; Исключение Попытка // Считаем, что только у элемента справочника есть Код НД=ОбъектИлиКонтекст.Код; ТипОбъекта="Справочник"; Исключение // Что нам передали? Программист с бодуна что-то пихнул не то ТипОбъекта="НеизвестныйКонтекст" КонецПопытки; КонецПопытки; КонецЕсли; Если (ТипОбъекта<>"Справочник") и (ТипОбъекта<>"Документ") Тогда Сообщить("Передан объект неверного типа "+ТипОбъекта+" в функцию глЗаписатьРеквизит()! Нужен элемент справочника или документ!","!"); Возврат -1; КонецЕсли; Если ПереданКонтекст=1 Тогда // Теперь шаманство с проверкой открытия на "только просмотр". // Если форма объекта открыта на только просмотр, то записать через контекст объект не получится. Если ОбъектИлиКонтекст.Форма.ТолькоПросмотр()=1 Тогда // Как определить? Да просто попробуем перевести форму в режим записи. // В режиме "только просмотр" это не пройдет. ОбъектИлиКонтекст.Форма.ТолькоПросмотр(0); Если ОбъектИлиКонтекст.Форма.ТолькоПросмотр()=1 Тогда ПереданКонтекст=0; Иначе // Вернем как было ОбъектИлиКонтекст.Форма.ТолькоПросмотр(1); КонецЕсли; КонецЕсли; КонецЕсли; ВидОбъекта=ОбъектИлиКонтекст.Вид(); ИдОбъекта=""+ТипОбъекта+"."+ВидОбъекта; Если ПереданКонтекст=0 Тогда Если ТипОбъекта="Справочник" Тогда Спр=СоздатьОбъект(ИдОбъекта); Если Спр.НайтиЭлемент(ОбъектИлиКонтекст.ТекущийЭлемент())=0 Тогда Сообщить("Ошибка в функции глЗаписатьРеквизит()! Объект "+ОбъектИлиКонтекст+" не найден!","!"); Возврат -1; Иначе Попытка Спр.УстановитьАтрибут(ИмяРеквизита,ЗначениеРеквизита); Исключение Сообщить("Ошибка при попытке записи реквизита объекта "+ОбъектИлиКонтекст+"! Возможно, у него нет такого реквизита.","!"); Возврат -1; КонецПопытки; // Иногда бывает вылетает ошибка при блокировке. Дадим программе некоторое время, а потом сругнемся. Флаг=1; СчетчикЦиклов=0; Пока Флаг=1 Цикл Если СчетчикЦиклов>100000 Тогда Сообщить("Ошибка при попытке записи реквизита для "+ОбъектИлиКонтекст+"! Элемент заблокирован!","!"); Возврат -1; КонецЕсли; Флаг=0; Попытка Спр.Записать(); Исключение Флаг=1; СчетчикЦиклов=СчетчикЦиклов+1; КонецПопытки; КонецЦикла; КонецЕсли; Иначе // ТипОбъекта="Документ" Док=СоздатьОбъект(ИдОбъекта); Если Док.НайтиДокумент(ОбъектИлиКонтекст.ТекущийДокумент())=0 Тогда Сообщить("Ошибка в функции глЗаписатьРеквизит()! Объект "+ОбъектИлиКонтекст+" не найден!","!"); Возврат -1; Иначе Попытка Док.УстановитьАтрибут(ИмяРеквизита,ЗначениеРеквизита); Исключение Сообщить("Ошибка при попытке записи реквизита для объекта "+ОбъектИлиКонтекст+"! Возможно у него нет такого реквизита.","!"); Возврат ""; КонецПопытки; // Иногда бывает вылетает ошибка при блокировке. Дадим программе некоторое время, а потом сругнемся. Флаг=1; СчетчикЦиклов=0; Пока Флаг=1 Цикл Если СчетчикЦиклов>100000 Тогда Сообщить("Ошибка при попытке записи реквизита для "+ОбъектИлиКонтекст+"! Документ заблокирован!","!"); Возврат -1; КонецЕсли; Флаг=0; Попытка Док.Записать(); Исключение Флаг=1; СчетчикЦиклов=СчетчикЦиклов+1; КонецПопытки; КонецЦикла; КонецЕсли; КонецЕсли; Иначе // ПереданКонтекст=1 Если ТипОбъекта="Справочник" Тогда Если ОбъектИлиКонтекст.Модифицированность()=1 Тогда // Ну мы подписывались записать только указанный реквизит Сообщить("Элемент справочника "+ОбъектИлиКонтекст+" модифицирован! Сначала сохраните его!","!"); Возврат -1; КонецЕсли; Попытка ОбъектИлиКонтекст.УстановитьАтрибут(ИмяРеквизита,ЗначениеРеквизита); Исключение Сообщить("Ошибка при попытке записи реквизита для объекта "+ОбъектИлиКонтекст+"! Возможно у него нет такого реквизита.","!"); Возврат -1; КонецПопытки; ОбъектИлиКонтекст.Записать(); Иначе // ТипОбъекта="Документ" Если ОбъектИлиКонтекст.Проведен()=0 Тогда // Ну эта проверка по желанию Сообщить("Документ "+ОбъектИлиКонтекст+" не проведен! Сначала проведите его!","!"); Возврат -1; КонецЕсли; Если ОбъектИлиКонтекст.Модифицированность()=1 Тогда // Ну мы подписывались записать только указанный реквизит Сообщить("Документ "+ОбъектИлиКонтекст+" модифицирован! Сначала сохраните его!","!"); Возврат -1; КонецЕсли; Попытка ОбъектИлиКонтекст.УстановитьАтрибут(ИмяРеквизита,ЗначениеРеквизита); Исключение Сообщить("Ошибка при попытке записи реквизита для объекта "+ОбъектИлиКонтекст+"! Возможно у него нет такого реквизита.","!"); Возврат -1; КонецПопытки; // Внимание! Я так делаю только для реквизитов, которые ничего не значат при проведении. ОбъектИлиКонтекст.ПриЗаписиПерепроводить(0); ОбъектИлиКонтекст.Записать(); ОбъектИлиКонтекст.ПриЗаписиПерепроводить(1); КонецЕсли; КонецЕсли; Возврат 0; КонецФункции Возможные прикладные задачи: Замечания: Замечены иногда подвисания, но пока что непонятно виновата ли в этом приведенная функция или что-то иное. Ситуацию крайне сложно повторить. |
Сообщ.
#18
,
|
|
|
Эх, проблема найдена. Прикольная очередная багофича.
Условия возникновения: Функция вызывается из формы документа сразу после создания и проведения, у пользователя нет прав на изменение проведенных документов и перепроведение. -> Программа повисает, в отладчике происходит вылет в случайном месте. Если документ закрыть, а потом открыть, то все работает. Функция вызывается из формы документа, у пользователя нет прав на изменение проведенных документов без перепроведения, но есть право на перепроведение. -> Ошибка отсутствия прав на изменение документа без перепроведения. Похоже это не лечится. |
Сообщ.
#19
,
|
|
|
Ещё один способ разобрать текстовую строку типа "A|B|C|D|E|F..."
// Возвращает список значений (параметры) Функция ПолучитьПараметры(Стр2) Стр = Стр2; // Пусть будет так :\ Список = СоздатьОбъект("СписокЗначений"); Пока 1 = 1 Цикл К = Найти(Стр,"|"); Если К = 0 Тогда Список.ДобавитьЗначение(Стр); Возврат Список; Иначе Список.ДобавитьЗначение(Лев(Стр,К-1)); Стр = Прав(Стр,СтрДлина(Стр)-К); КонецЕсли; КонецЦикла; КонецФункции |
Сообщ.
#20
,
|
|
|
RusUdin, извращенец.
СЗ = СоздатьОбъект("СписокЗначений"); СЗ.ИзСтрокиСРазделителями(""""+СтрЗаменить(Стр,"|",""",""")+""""); ЗЫ: могла запутаться с кавычками. |
Сообщ.
#21
,
|
|
|
RusUdin, функция портит переданный параметр, что может быть неприятным сюрпризом для использующего ее программиста. Передавай параметр по значению или заведи локальную переменную.
И чего тут оригинального? |
Сообщ.
#22
,
|
|
|
Рысь не будет работать если строка выглядит типа:
0001|Магнитофон "Электроника-302"|Склад "Никаковский" |
Сообщ.
#23
,
|
|
|
Цитата RusUdin @ Рысь не будет работать если строка выглядит типа: 0001|Магнитофон "Электроника-302"|Склад "Никаковский" А вот так СЗ.ИзСтрокиСРазделителями(""""+СтрЗаменить(СтрЗаменить(Стр,"""","""""")),"|",""",""")+""""); |
Сообщ.
#24
,
|
|
|
Функция РазложитьСтрокуВМассивПодстрок(Знач Стр, Разделитель = ",") Экспорт МассивСтрок = Новый Массив(); Если СтрДлина(Разделитель) = 1 Тогда Стр = СокрЛП(Стр); Пока 1=1 Цикл Поз = Найти(Стр,Разделитель); Если Поз=0 Тогда МассивСтрок.Добавить(Стр); Возврат МассивСтрок; КонецЕсли; МассивСтрок.Добавить(Лев(Стр,Поз-1)); Стр = СокрЛ(Сред(Стр,Поз)); КонецЦикла; Иначе ДлинаРазделителя = СтрДлина(Разделитель); Пока 1=1 Цикл Поз = Найти(Стр,Разделитель); Если Поз=0 Тогда МассивСтрок.Добавить(Стр); Возврат МассивСтрок; КонецЕсли; МассивСтрок.Добавить(Лев(Стр,Поз-1)); Стр = Сред(Стр,Поз+ДлинаРазделителя); КонецЦикла; КонецЕсли; КонецФункции // глРазложить Тоже для 8 очень полезно при загрузки данных из текста |
Сообщ.
#25
,
|
|
|
Цитата Mechanic @ СЗ.ИзСтрокиСРазделителями(""""+СтрЗаменить(СтрЗаменить(Стр,"""","""""")),"|",""",""")+""""); А вот это уже точно громозко )) |
Сообщ.
#26
,
|
|
|
Цитата RusUdin @ // Делал сам: // {{{ // Функции работы с датой // Удобны например для получения разницы в днях между датами, получения дня от начала года/стролетия и т.д. // Вход: // Дат - Дата // Выход: Порядковый номер дня от начала года Функция глПолучитьДеньГода(Дат) Экспорт ДеньГода = 0; Для Н = 1 По ДатаМесяц(Дат)-1 Цикл ДеньГода = ДеньГода+ДатаЧисло(КонМесяца(Дата(ДатаГод(Дат),Н,1))); КонецЦикла; Возврат ДеньГода+ДатаЧисло(Дат); КонецФункции // Вход: // Дат - Дата // Выход: Порядковый номер дня от начала столетия Функция глПолучитьДеньСтолетия(Дат) Экспорт ДеньСтолетия = 0; Для Н = 1900 По ДатаГод(Дат)-1 Цикл ДеньСтолетия = ДеньСтолетия+глПолучитьДеньГода(Дата(Н,12,31)); КонецЦикла; Возврат ДеньСтолетия+глПолучитьДеньГода(Дат); КонецФункции // Вход: // Год - Год по которому нужно получить дату от его начала // День - День от начала года "Год" по которому нужно получить дату // Выход: Дата дня "День" от начала года "Год Функция глПолучитьДатуПоДнюГода(Год,День) Экспорт ДеньГода = 0; Для Н = 1 По 12 Цикл ДеньГода = ДеньГода+ДатаЧисло(КонМесяца(Дата(Год,Н,1))); Если ДеньГода >= День Тогда Чис = День-глПолучитьДеньГода(Дата(Год,Н,1))+1; Возврат Дата(Год,Н,Чис); КонецЕсли; КонецЦикла; Возврат Дата(Год,12,День-глПолучитьДеньГода(Дата(Год,12,1))+1); КонецФункции // Вход: // День - Порядковый номер дня от начала столетия // Выход: Дата этого дня Функция глПолучитьДатуПоДнюСтолетия(День) Экспорт ДеньСтолетия = 0; ПД = Цел(День/365); Для Н = 1900 По 1900+ПД Цикл ДеньСтолетия = ДеньСтолетия+глПолучитьДеньГода(Дата(Н,12,31)); Если ДеньСтолетия >= День Тогда Возврат глПолучитьДатуПоДнюГода(Н,День-глПолучитьДеньСтолетия(Дата(Н,1,1))+1); КонецЕсли; КонецЦикла; Возврат глПолучитьДатуПоДнюГода(ПД,День-глПолучитьДеньСтолетия(Дата(ПД,1,1))+1); КонецФункции // Вход: // Дат - Дата к которой нужно добавить/убавить дней // КоличествоДней - Количество дней которое нужно прибавить // Выход: Дата получаемая путём прибавления/убавления к дате "Дат" числа дней "КоличествоДней" Функция глДобавитьДнейКДате(Дат,КоличествоДней) Экспорт ДеньСтолетия=глПолучитьДеньСтолетия(Дат); Возврат глПолучитьДатуПоДнюСтолетия(ДеньСтолетия+КоличествоДней); КонецФункции // }}} Работа с датами от начала столетия - возможно кому-то пригодиться, но вообще нужно внимательно "учить мат.часть": смысл функции глПолучитьДеньГода(Дат) - стандартная функция 1С: НомерДняГода(<Дата>) функция глПолучитьДатуПоДнюГода(Год,День) - намного проще: Возврат Дата(Год,1,1)+День функция глДобавитьДнейКДате(Дат,КоличествоДней): Дат+КоличествоДней (функция как таковая вообще не нужна - тип "Дата" поддерживает операции сложения/вычитания) -Added Цитата RusUdin @ Цитата Mechanic @ СЗ.ИзСтрокиСРазделителями(""""+СтрЗаменить(СтрЗаменить(Стр,"""","""""")),"|",""",""")+""""); А вот это уже точно громозко )) Это намного правильнее, быстрее и менее громоздко, чем функцию писать |
Сообщ.
#27
,
|
|
|
Цитата AndreyM2007 @ Это намного правильнее, быстрее и менее громоздко, чем функцию писать Зато наглядность страдает. |
Сообщ.
#28
,
|
|
|
v7.7 Корректный расчет номера недели.
Стандартная 1Совская функция считает, что 1 января всегда 1я неделя года. Но по стандарту это не так. Предлагаю свой вариант корректировки значения, выдаваемого стандартной функцией. Вариант 1: Функция НормНомерНеделиГода(Дт) НГода = НачГода(Дт); // Только для оптимизации, чтобы два раза не вызывать НачГода() Номер1С = НомерНеделиГода(Дт) + ?(НГода-НачНедели(НГода)>КонНедели(НГода) - НГода, -1 , 0); Возврат ?(Номер1С = 0,53,Номер1С); КонецФункции Вариант 2: Функция НормНомерНеделиГода(Дт) Номер1С = Номер1С = НомерНеделиГода(Дт) + ?(НомерДняНедели(НачГода(Дт))>4, -1 , 0);; Возврат ?(Номер1С = 0,53,Номер1С); КонецФункции Источники: ISO 8601:1988 Date/Time Representations ISO 8601 (Wiki) |
Сообщ.
#29
,
|
|
|
Процедура по посылки сообщений чарез Skype для 8.*
Сделанно на УТ добавлено перечисление "Перечисления.ТипыКонтактнойИнформации.Skype" Использует безплантую компаненту Skype4COM home procedure ПослатьСообщениеВСкайп(Кому,ТекстСообщения) export МассивКИ = ПолучитьМассивКИ(Кому,Перечисления.ТипыКонтактнойИнформации.Skype); Если МассивКИ.количество()=0 тогда возврат; КонецЕсли; If ЗначениеНеЗаполнено(ТекстСообщения) тогда возврат; КонецЕсли; СкайпИмя = МассивКИ[0]; try oSkype = new comObject("Skype4COM.Skype"); If Not oSkype.Client.IsRunning Then oSkype.Client.Start(); EndIf; oChat = oSkype.CreateChatWith(""+СкайпИмя); oChat.SendMessage(ТекстСообщения); except СообщитьОбОшибке("Ошибка при отсылке по скайп: " + ОписаниеОшибки(),false,""); endtry; КонецПроцедуры функция ПолучитьМассивКИ(Чей,ТипКонтактнойИнформации) Qry = new Запрос("ВЫБРАТЬ | КонтактнаяИнформация.Представление |ИЗ | РегистрСведений.КонтактнаяИнформация КАК КонтактнаяИнформация |ГДЕ | КонтактнаяИнформация.Объект = &Контрагент | И КонтактнаяИнформация.Тип = &Тип"); qry.УстановитьПараметр("Контрагент",Чей); qry.УстановитьПараметр("Тип",ТипКонтактнойИнформации); res = qry.Выполнить().Выгрузить(); List = new СписокЗначений(); List.ЗагрузитьЗначения(res.ВыгрузитьКолонку("Представление")); return List; конецФункции |
Сообщ.
#30
,
|
|
|
Столкнулся недавно с вопросом импорта в 1с из СУБД Firebird и полазив по инету обгнаружил что встречается задача не так уж и редко. Поэтому пожалуй выложу небольшую наработку.
Функции в которые вынесена логика работы с firebird (если несколько объектов конфигурации должны выполнять запросы к БД кладем в глобальный модуль с экспортом, иначе можно просто в модуле диалога): Перем Firebird_SQL_Error; Функция Firebird_Connect(ADOConnection, DBServer, DBFile, DBLogin, DBPassword) // Подключается к серверу Firebird // При успешном подключении возвращает 1, иначе описание ошибки ADOConnection.ConnectionString = "Driver={Firebird/InterBase(r) driver};Dbname=" + СокрЛП(DBServer) + ":" + СокрЛП(DBFile) + ";CHARSET=NONE;Uid=" + СокрЛП(DBLogin) + ";Pwd=" + СокрЛП(DBPassword) + ";Client=gds32.dll"; ADOConnection.ConnectionTimeout = 60; ADOConnection.CursorLocation = 3; Попытка ADOConnection.Open(); Возврат 1 Исключение Возврат ОписаниеОшибки(); КонецПопытки; КонецФункции Функция Firebird_Disconnect(ADOConnection) // Рвет соединение с сервером // При успешном отключении возвращает 1, иначе описание ошибки Попытка ADOConnection.Close(); Возврат 1; Исключение Возврат ОписаниеОшибки(); КонецПопытки; КонецФункции Процедура Firebird_SQL_to_ValueTable(ADOConnection, SQL_String, ТЗ) // Возвращает рекордсе в видек таблицы значений // При ошибке возвращает 0 и пишет описание ошибки в // переменную Firebird_SQL_Error Перем RS, Шаг, НомСтроки; ТЗ = СоздатьОбъект("ТаблицаЗначений"); КS = AdoConnection.Execute(SQL_String); Для Шаг = 0 По RS.Fields.Count() -1 Цикл ТЗ.НоваяКолонка(RS.Fields(Шаг).Name); КонецЦикла; RS.MoveFirst(); Пока RS.Eof() = 0 Цикл НомСтроки = ТЗ.НоваяСтрока(); Для Шаг = 0 По RS.Fields.Count() -1 Цикл Попытка ТЗ.УстановитьЗначение(НомСтроки, RS.Fields(Шаг).Name, RS.Fields(Шаг).Value); Исключение Сообщить (НомСтроки + " " + RS.Fields(Шаг)); КонецПопытки; КонецЦикла; RS.MoveNext(); КонецЦикла; Firebird_SQL_Error = ОписаниеОшибки(); КонецПроцедуры Функция НеНоль(Значение) Если Значение = 0 Тогда Возврат 1; Иначе Возврат Значение; КонецЕсли; КонецФункции Пример использования (грубоватый, его еще не приглаживал особо): Процедура Импорт() // Процедура осуществляет перегрузку данных из fb Перем Значение, Соединение, ТЗ, Перезапись; Состояние ("Подключение к серверу Firebird..."); // Создаем COM объект Соединение = CreateObject("ADODB.Connection"); // Коннектимся к серверу Значение = Firebird_Connect(Соединение, Сервер, БД, Логин, Пароль); Если (Значение <> 1) Тогда Сообщить ("При подключении к серверу БД произошла ошибка: " + Значение, "!!!"); Возврат; КонецЕсли; // Импортируем справочник авторов Состояние("Выполнение запроса к БД Firebird..."); СтрокаSQL = "select avtors from book group by avtors"; Firebird_SQL_to_ValueTable(Соединение, СтрокаSQL, ТЗ); Если СокрЛП(Firebird_SQL_Error) <> "" Тогда Сообщить("Ошибка обращения к БД. Неверный sql запрос! " + Firebird_SQL_Error); Возврат; КонецЕсли; Спр = СоздатьОбъект("Справочник.Авторы"); Если Очищать = 1 Тогда // Если юзер поставил галочку очищать справочники Спр.ВыбратьЭлементы(); Пока Спр.ПолучитьЭлемент() = 1 Цикл Состояние ("Удаление автора " + Спр.Наименование); Спр.Удалить(); КонецЦикла; КонецЕсли; Для Шаг = 1 По ТЗ.КоличествоСтрок() Цикл Состояние("Заполнение данных на автора " + ТЗ.ПолучитьЗначение(Шаг, "Avtors")); Если КонтрольДублей =1 Тогда Если Спр.НайтиПоНаименованию(ТЗ.ПолучитьЗначение(Шаг, "Avtors")) = 1 Тогда // Иначе Спр.Новый(); КонецЕсли; Иначе Спр.Новый(); КонецЕсли; Спр.ПерваяБуква = Лев(ТЗ.ПолучитьЗначение(Шаг, "Avtors"), 1); Спр.Наименование = ТЗ.ПолучитьЗначение(Шаг, "Avtors"); Спр.Наименованиеоригинальное = ТЗ.ПолучитьЗначение(Шаг, "Avtors"); Спр.Титул = ТЗ.ПолучитьЗначение(Шаг, "Avtors"); Спр.Записать(); КонецЦикла; // Импортируем справочник издательств Состояние("Выполнение запроса к БД Firebird..."); СтрокаSQL = "select name_i from book group by name_i"; Firebird_SQL_to_ValueTable(Соединение, СтрокаSQL, ТЗ); Если СокрЛП(Firebird_SQL_Error) <> "" Тогда Сообщить("Ошибка обращения к БД. Неверный sql запрос! " + Firebird_SQL_Error); Возврат; КонецЕсли; Спр = СоздатьОбъект("Справочник.Издательства"); Если Очищать = 1 Тогда // Если юзер поставил галочку очищать справочники Спр.ВыбратьЭлементы(); Пока Спр.ПолучитьЭлемент() = 1 Цикл Состояние ("Удаление издательства " + Спр.Наименование); Спр.Удалить(); КонецЦикла; КонецЕсли; Для Шаг = 1 По ТЗ.КоличествоСтрок() Цикл Состояние("Заполнение данных издательства " + ТЗ.ПолучитьЗначение(Шаг, "name_i")); Если КонтрольДублей =1 Тогда Если Спр.НайтиПоНаименованию(ТЗ.ПолучитьЗначение(Шаг, "name_i")) = 1 Тогда // Иначе Спр.Новый(); КонецЕсли; Иначе Спр.Новый(); КонецЕсли; Спр.Наименование = ТЗ.ПолучитьЗначение(Шаг, "name_i"); Спр.Записать(); КонецЦикла; // Импортируем индексы УДК Состояние("Выполнение запроса к БД Firebird..."); СтрокаSQL = "select shifr1 from book group by shifr1"; Firebird_SQL_to_ValueTable(Соединение, СтрокаSQL, ТЗ); Если СокрЛП(Firebird_SQL_Error) <> "" Тогда Сообщить("Ошибка обращения к БД. Неверный sql запрос! " + Firebird_SQL_Error); Возврат; КонецЕсли; Спр = СоздатьОбъект("Справочник.ИндексыУДК"); Если Очищать = 1 Тогда // Если юзер поставил галочку очищать справочники Спр.ВыбратьЭлементы(); Пока Спр.ПолучитьЭлемент() = 1 Цикл Состояние ("Удаление индекса УДК " + Спр.Наименование); Спр.Удалить(); КонецЦикла; КонецЕсли; Для Шаг = 1 По ТЗ.КоличествоСтрок() Цикл Попытка Состояние("Заполнение данных индекса УДК " + ТЗ.ПолучитьЗначение(Шаг, "shifr1")); Если КонтрольДублей =1 Тогда Если Спр.НайтиПоНаименованию(ТЗ.ПолучитьЗначение(Шаг, "shifr1")) = 1 Тогда // Возврат; Иначе Спр.Новый(); КонецЕсли; Иначе Спр.Новый(); КонецЕсли; Спр.Код = Число(ТЗ.ПолучитьЗначение(Шаг, "shifr1")); Спр.Наименование = ТЗ.ПолучитьЗначение(Шаг, "shifr1"); Спр.Записать(); Исключение Состояние ("Индекс дублируется..."); КонецПопытки; КонецЦикла; // Импортируем книги Состояние("Выполнение запроса к БД Firebird..."); СтрокаSQL = "SELECT BOOK.AVTORS, BOOK.NAME_B, BOOK.NAME_I, BOOK.SHIFR1, BOOK.SHIFR2, BOOK.KEY_I, BOOK.KOD_T, Count(BOOK.KOL) AS KOL, BOOK.GOD_I, BOOK.KOLPAGES FROM BOOK GROUP BY BOOK.AVTORS, BOOK.NAME_B, BOOK.NAME_I, BOOK.SHIFR1, BOOK.SHIFR2, BOOK.KEY_I, BOOK.KOD_T, BOOK.GOD_I, BOOK.KOLPAGES"; Firebird_SQL_to_ValueTable(Соединение, СтрокаSQL, ТЗ); Если СокрЛП(Firebird_SQL_Error) <> "" Тогда Сообщить("Ошибка обращения к БД. Неверный sql запрос! " + Firebird_SQL_Error); Возврат; КонецЕсли; Спр = СоздатьОбъект("Справочник.Книги"); Если Очищать = 1 Тогда // Если юзер поставил галочку очищать справочники Спр.ВыбратьЭлементы(); Пока Спр.ПолучитьЭлемент() = 1 Цикл Состояние ("Удаление книги " + Спр.Наименование); Спр.Удалить(); КонецЦикла; КонецЕсли; Для Шаг = 1 По ТЗ.КоличествоСтрок() Цикл Состояние("Заполнение данных на книгу " + ТЗ.ПолучитьЗначение(Шаг, "name_b")); Если КонтрольДублей =1 Тогда Если Спр.НайтиПоНаименованию(ТЗ.ПолучитьЗначение(Шаг, "name_b")) = 1 Тогда // Иначе Спр.Новый(); КонецЕсли; Иначе Спр.Новый(); КонецЕсли; СпрАвтор = СоздатьОбъект("Справочник.Авторы"); СпрИзд = СоздатьОбъект("Справочник.Издательства"); Спр.Наименование = ТЗ.ПолучитьЗначение(Шаг, "name_b"); СпрАвтор.НайтиПоНаименованию(ТЗ.ПолучитьЗначение(Шаг, "avtors")); Спр.Автор = СпрАвтор.ТекущийЭлемент(); Спр.ПолноеНаименование = ТЗ.ПолучитьЗначение(Шаг, "name_b"); СпрИзд.НайтиПоНаименованию(ТЗ.ПолучитьЗначение(Шаг, "name_i")); Спр.Издательство = СпрИзд.ТекущийЭлемент(); Спр.ДатаИздания = ТЗ.ПолучитьЗначение(Шаг, "god_i"); Спр.Объем = ТЗ.ПолучитьЗначение(Шаг, "kolpages"); Спр.Количество = НеНоль(ТЗ.ПолучитьЗначение(Шаг, "kol")); Спр.АвторскийЗнак = ТЗ.ПолучитьЗначение(Шаг, "shifr2"); Спр.ОригинальноеНаименование = ТЗ.ПолучитьЗначение(Шаг, "name_b"); Спр.Записать(); КонецЦикла; Сообщить ("Готово :)"); Firebird_Disconnect(Соединение); КонецПроцедуры Вопрос записи в fb не стоял - так что это готовый пример только для импорта. Для экспорта в fb нужно дорабатывать Добавлено Зы. Это для 7-ки, но на 8-ку адаптировать в принципе 1,5 минцуты |