На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела:

  • Перед тем, как задать вопрос, желательно почитать документацию и воспользоваться поиском.
  • Когда задаёте вопрос, то обязательно указывайте платформу (7.7, 8.0, 8.1, 8.2, etc), причем желательно в заголовке. Если речь идёт о типовой конфигурации, то указывайте её название и релиз. Текущие версии можно посмотреть здесь.
  • Ещё раз напоминаем о необходимости соблюдать не только правила, но и законы. Уважайте авторские права.

Высказать своё мнение о модераторах раздела можно здесь: evGenius
Страницы: (3) 1 [2] 3  все  ( Перейти к последнему сообщению )  
> Оригинальные решения v7/v8 , Флейм, наверное, но по теме
    Цитата RusUdin @
    Функции работы с датой

    Оригинально, но громоздко! :rolleyes:

    Имхо, можно заменить:
    ExpandedWrap disabled
      Дата10ДнейНазад = глДобавитьДнейКДате(РабочаяДата(),-10);
       
      //на
       
      Дата10ДнейНазад = РабочаяДата() - 10;
      Эх. Хотите оригинальное решение? Получайте.

      v7
      Исходная задача:
      Нужно записать реквизит документа или справочника по ссылке или через контекст.
      Исследование предмета задачи:
      Ну при записи реквизита через ссылку все понятно, вопросы возникают при записи через переданный контекст самого элемента справочника или документа. Исследование показало, что при открытии на чтение объект базы на запись не блокируется, если же открыть на запись - блокируется. Даже если открыть объект на запись, а затем где-то в модуле формы будет вызвано Форма.ТолькоПросмотр(1), то блокировка на запись останется. Все логично.
      Решение:
      Приведенная мной функция может содержать глюки, т.к. она несколько отличается от оригинала в живой базе (там она заточена только для записи штрих-кода).
      ExpandedWrap disabled
        // Записывает реквизит элемента справочника или документа.
        // При передаче контекста объект должен быть не модифицирован.
        // Возвращает 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;
        КонецФункции

      Возможные прикладные задачи:
      • Запись штрих-кода непосредственно перед его печатью сразу после его формирования.
      • Установка флагов некоторых действий над объектами, которые должны быть выполнены однократно.
      Замечания:
      Замечены иногда подвисания, но пока что непонятно виновата ли в этом приведенная функция или что-то иное. Ситуацию крайне сложно повторить.
        Эх, проблема найдена. Прикольная очередная багофича.
        Условия возникновения:

        Функция вызывается из формы документа сразу после создания и проведения, у пользователя нет прав на изменение проведенных документов и перепроведение. -> Программа повисает, в отладчике происходит вылет в случайном месте. Если документ закрыть, а потом открыть, то все работает.

        Функция вызывается из формы документа, у пользователя нет прав на изменение проведенных документов без перепроведения, но есть право на перепроведение. -> Ошибка отсутствия прав на изменение документа без перепроведения.

        Похоже это не лечится.
          Ещё один способ разобрать текстовую строку типа "A|B|C|D|E|F..."
          ExpandedWrap disabled
            // Возвращает список значений (параметры)
            Функция ПолучитьПараметры(Стр2)    
            Стр = Стр2; // Пусть будет так :\          
                Список = СоздатьОбъект("СписокЗначений");
                                  
                Пока 1 = 1 Цикл
                    К = Найти(Стр,"|");
                    Если К = 0 Тогда
                        Список.ДобавитьЗначение(Стр);
                        Возврат Список;
                    Иначе  
                        Список.ДобавитьЗначение(Лев(Стр,К-1));
                        Стр = Прав(Стр,СтрДлина(Стр)-К);
                    КонецЕсли;
                КонецЦикла;
            КонецФункции
          Сообщение отредактировано: RusUdin -
            RusUdin, извращенец.
            ExpandedWrap disabled
              СЗ = СоздатьОбъект("СписокЗначений");
              СЗ.ИзСтрокиСРазделителями(""""+СтрЗаменить(Стр,"|",""",""")+"""");

            ЗЫ: могла запутаться с кавычками.
              RusUdin, функция портит переданный параметр, что может быть неприятным сюрпризом для использующего ее программиста. Передавай параметр по значению или заведи локальную переменную.
              И чего тут оригинального?
                :blink: Рысь не будет работать если строка выглядит типа:
                0001|Магнитофон "Электроника-302"|Склад "Никаковский"
                  Цитата RusUdin @
                  Рысь не будет работать если строка выглядит типа:
                  0001|Магнитофон "Электроника-302"|Склад "Никаковский"

                  А вот так
                  ExpandedWrap disabled
                    СЗ.ИзСтрокиСРазделителями(""""+СтрЗаменить(СтрЗаменить(Стр,"""","""""")),"|",""",""")+"""");

                  ;)
                    ExpandedWrap disabled
                      Функция РазложитьСтрокуВМассивПодстрок(Знач Стр, Разделитель = ",") Экспорт
                          
                          МассивСтрок = Новый Массив();
                          Если СтрДлина(Разделитель) = 1 Тогда
                              Стр = СокрЛП(Стр);
                              Пока 1=1 Цикл
                                  Поз = Найти(Стр,Разделитель);
                                  Если Поз=0 Тогда
                                      МассивСтрок.Добавить(Стр);
                                      Возврат МассивСтрок;
                                  КонецЕсли;
                                  МассивСтрок.Добавить(Лев(Стр,Поз-1));
                                  Стр = СокрЛ(Сред(Стр,Поз));
                              КонецЦикла;
                          Иначе
                              ДлинаРазделителя = СтрДлина(Разделитель);
                              Пока 1=1 Цикл
                                  Поз = Найти(Стр,Разделитель);
                                  Если Поз=0 Тогда
                                      МассивСтрок.Добавить(Стр);
                                      Возврат МассивСтрок;
                                  КонецЕсли;
                                  МассивСтрок.Добавить(Лев(Стр,Поз-1));
                                  Стр = Сред(Стр,Поз+ДлинаРазделителя);
                              КонецЦикла;
                          КонецЕсли;
                          
                      КонецФункции // глРазложить


                    Тоже для 8 очень полезно при загрузки данных из текста
                      Цитата Mechanic @
                      СЗ.ИзСтрокиСРазделителями(""""+СтрЗаменить(СтрЗаменить(Стр,"""","""""")),"|",""",""")+"""");

                      А вот это уже точно громозко :)))
                        Цитата RusUdin @
                        ExpandedWrap disabled
                          // Делал сам:
                          // {{{                      
                          // Функции работы с датой
                          // Удобны например для получения разницы в днях между датами, получения дня от начала года/стролетия и т.д.
                          // Вход:
                          //   Дат - Дата
                          // Выход: Порядковый номер дня от начала года
                          Функция глПолучитьДеньГода(Дат) Экспорт
                              ДеньГода = 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 @
                        СЗ.ИзСтрокиСРазделителями(""""+СтрЗаменить(СтрЗаменить(Стр,"""","""""")),"|",""",""")+"""");

                        А вот это уже точно громозко :)))

                        Это намного правильнее, быстрее и менее громоздко, чем функцию писать
                          Цитата AndreyM2007 @
                          Это намного правильнее, быстрее и менее громоздко, чем функцию писать

                          Зато наглядность страдает.
                            v7.7 Корректный расчет номера недели.
                            Стандартная 1Совская функция считает, что 1 января всегда 1я неделя года.
                            Но по стандарту это не так. Предлагаю свой вариант корректировки значения, выдаваемого стандартной функцией.

                            Вариант 1:
                            ExpandedWrap disabled
                              Функция НормНомерНеделиГода(Дт)
                                  НГода = НачГода(Дт);  // Только для оптимизации, чтобы два раза не вызывать НачГода()
                                  Номер1С = НомерНеделиГода(Дт) + ?(НГода-НачНедели(НГода)>КонНедели(НГода) - НГода, -1 , 0);
                                  Возврат ?(Номер1С = 0,53,Номер1С);
                              КонецФункции

                            Вариант 2:
                            ExpandedWrap disabled
                              Функция НормНомерНеделиГода(Дт)
                                  Номер1С = Номер1С = НомерНеделиГода(Дт) + ?(НомерДняНедели(НачГода(Дт))>4, -1 , 0);;
                                  Возврат ?(Номер1С = 0,53,Номер1С);
                              КонецФункции


                            Источники:
                            ISO 8601:1988 Date/Time Representations
                            ISO 8601 (Wiki)
                              Процедура по посылки сообщений чарез Skype для 8.*
                              Сделанно на УТ добавлено перечисление "Перечисления.ТипыКонтактнойИнформации.Skype"
                              Использует безплантую компаненту Skype4COM home
                              ExpandedWrap disabled
                                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;
                                конецФункции
                                Столкнулся недавно с вопросом импорта в 1с из СУБД Firebird и полазив по инету обгнаружил что встречается задача не так уж и редко. Поэтому пожалуй выложу небольшую наработку.

                                Функции в которые вынесена логика работы с firebird (если несколько объектов конфигурации должны выполнять запросы к БД кладем в глобальный модуль с экспортом, иначе можно просто в модуле диалога):

                                ExpandedWrap disabled
                                  Перем 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;
                                      Иначе
                                          Возврат Значение;
                                      КонецЕсли;
                                  КонецФункции


                                Пример использования (грубоватый, его еще не приглаживал особо):

                                ExpandedWrap disabled
                                  Процедура Импорт()
                                      // Процедура осуществляет перегрузку данных из 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 минцуты
                                Сообщение отредактировано: @@@ -
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (3) 1 [2] 3  все


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0732 ]   [ 15 queries used ]   [ Generated: 19.03.24, 05:54 GMT ]