На главную
ПРАВИЛА FAQ Помощь Участники Календарь Избранное DigiMania RSS
msm.ru
! Правила раздела:

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

Высказать своё мнение о модераторах раздела можно здесь: evGenius
Модераторы: evGenius
  
> Оригинальные решения v7/v8, Флейм, наверное, но по теме
    Может складывать сюда те решения, которые вам помогли/понравились... ? а-ля каталог НСР (нестандартные решения)


    Вчера, лазя по 1C.proclub.ru ...

    1. Самомодифицирующийся код для 1Сv7.
    Форма документа:
    ExpandedWrap disabled
      Процедура ПоКнПровести()
          тРегистр = СокрЛП(РегистрДвиж); //текстовое представление регистра движения
          спсПарам = СоздатьОбъект("СписокЗначений");
          спсЗнИзм = СоздатьОбъект("СписокЗначений");
          спсЗнРес = СоздатьОбъект("СписокЗначений");
          
          тблИзм.Выгрузить(спсЗнИзм,,,"Значение");
          тблРес.Выгрузить(спсЗнРес,,,"Значение");
          спсПарам.ДобавитьЗначение(спсЗнИзм,"Измерения");
          спсПарам.ДобавитьЗначение(спсЗнРес,"Ресурсы");
          
          //формирование обработки проведения
          ТекстСкрипта = СоздатьОбъект("Текст");
          ТекстСкрипта.ДобавитьСтроку("//_____________________________________________________________________________
          |Процедура ОбработкаПроведения()");
          Если спсРег.РазмерСписка()>0 Тогда
              //запишем таблицы измерений и ресурсов, чтобы потом взять оттуда значения (можно конечно и списками это сделать)
              ТекстСкрипта.ДобавитьСтроку("тблИзм = ЗначениеИзСтроки(ТаблицаИзмерений);
              |тблРес = ЗначениеИзСтроки(ТаблицаРесурсов);
              |Если (ТипЗначенияСтр(тблИзм)<>""ТаблицаЗначений"") или (ТипЗначенияСтр(тблРес)<>""ТаблицаЗначений"") Тогда
              |   Сообщить(""Неверное значение таблицы Измерений или Ресурсов!"");
              |   СтатусВозврата(0);
              |   Возврат;
              |Иначе
              |   Если (тблИзм.КоличествоСтрок()=0) или (тблРес.КоличествоСтрок()=0) Тогда
              |       Сообщить(""Возможно у выбранного регистра нет измерений или ресурсов!"");
              |   КонецЕсли;
              |КонецЕсли;");
              тблИзм.ВыбратьСтроки();
              //заполнение значений измерений
              Пока тблИзм.ПолучитьСтроку()=1 Цикл
                  ТекстСкрипта.ДобавитьСтроку(тРегистр+"."+СокрЛП(тблИзм.Измерение)+" = тблИзм.ПолучитьЗначение("+тблИзм.НомерСтроки+",""Значение"");");
              КонецЦикла;
              тблРес.ВыбратьСтроки();
              //заполнение значений ресурсов
              Пока тблРес.ПолучитьСтроку()=1 Цикл
                  ТекстСкрипта.ДобавитьСтроку(тРегистр+"."+СокрЛП(тблРес.Ресурс)+" =  тблРес.ПолучитьЗначение("+тблРес.НомерСтроки+",""Значение"");");
              КонецЦикла;
              Если ВидДвиж=1 Тогда
                  ТекстСкрипта.ДобавитьСтроку(тРегистр+".ДвижениеПриходВыполнить();");
              Иначе
                  ТекстСкрипта.ДобавитьСтроку(тРегистр+".ДвижениеРасходВыполнить();");
              КонецЕсли;
          КонецЕсли;
          ТекстСкрипта.ДобавитьСтроку("КонецПроцедуры //ОбработкаПроведения
          |//_____________________________________________________________________________
          |Процедура ОбработкаУдаленияПроведения()
          |КонецПроцедуры //ОбработкаУдаленияПроведения");
          
          ТекстСкрипта.Записать(КаталогИБ()+"make.txt");
          Провести();
          //ФС.УдалитьФайл(КаталогИБ()+"make.txt");
          Форма.Закрыть();
          //если убрать следующий ниже комментарий,
          //то при отмене проведения документа будет ругаться: "Не могу открыть файл: make.txt"
          
          //ФС.УдалитьФайл(КаталогИБ()+"make.txt");
      КонецПроцедуры //ПоКнПровести

    И в модуле написано #ЗагрузитьИзФайла make.txt

    Вроде просто, но я бы до такого не додумалась...

    2. Несколько табличных частей для 1Сv7
    В шапке добавляется строковый реквизит неограниченной длины.
    На форму вешается ТЗ.
    При открытии формы пишется (пока на пробовала, но идея такова...) ТЗ = ЗначениеИзСтроки( <имя реквизита> );
    Работа с ТЗ описывается, ессно, самостоятельно...
    То же можно делать и для справочников
      Цитата

      В шапке добавляется строковый реквизит неограниченной длины


      Этого делать не советуеться... если перевети базу с DBF на SQL, то возможны проблемы в работоспособности, а именно критеская ошибка...я уже с этим не однократно сталкивался...
      Easy to find what's wrong
      Harder to find what's right
        значит так:
        есть документы, у них есть общие реквизиты, допустим "Автор", вот как раз то этот реквизит и был определен со стракой не определенного размера. и при открытии документа 1С'ка падала целиком, говорила что мол в приложении была допушина кретическая ошибка, приложение будет закрыто. и все, хоть ты трести...но это только в конфигурациях на базе SQL Server 2000.. , проблема решаеться элементарно, определяешь реквизит "Автор" строкой размера: 255, и все!

        Удачи!
        Easy to find what's wrong
        Harder to find what's right
          Цитата maxim84_ @
          ..но это только в конфигурациях на базе SQL Server 2000..

          Спасибо! Просто у меня SQL 7.0, и таких граблей я ещё не встречал. Это только для общих реквизитов, или вообще в любом реквизите шапки?
          Бо я ща как раз тулю таблицы в такой рекв-т, и 255 симвов там не хватит по-любому, а вдруг придется на 2000й SQL перебираться с этой конфой..
          Q: Can I create anything unique in Delphi? A: Of course! <Ctrl + Shift + G>.. ;) ©Mch
            Вот сегодня увеличил размерность до 510 - работает. видимо такая реакция наблюдаеться только при не определенном размере.
            Вот какой реквизит именно, я не в курсе, у меня такая трабла была только с общим реквизитом.
            Easy to find what's wrong
            Harder to find what's right
              Обсуждение глюка предагаю продолжить в Что-то вроде bug report, бо тут, типа оффтоп.. А в качестве извинения предлагаю новинку:
              Новинка! В помощь работодателю.
              Данный диалог призван отделить выдующихся пользователей от безнадёжных при приёме на работу оператора "со знанием 1С"... ;)
              user posted image
              Важно наблюдать за изменениями выражения лица испытуемого по мере углубления в суть вопроса.
              Имхо, забавно.. :unsure:
              Q: Can I create anything unique in Delphi? A: Of course! <Ctrl + Shift + G>.. ;) ©Mch
                V8
                ExpandedWrap disabled
                  Function Excel2ValueTable(FileName,LeftOffSet = 1,TopOffSet = 3) export
                      Excel = new ComObject("Excel.Application");
                      Data = Excel.workbooks.Open(FileName).Sheets(1);
                      Status("Excel Opened");
                      //ishem porvuju stroku
                      i=TopOffSet;
                      Text="";
                      cRow = data.Rows(i);
                      while EmptyValue(cRow.cells(LeftOffSet).value) do
                          i=i+1;
                          cRow = data.Rows(i);
                      enddo;
                      ValueTable = new ТаблицаЗначений;
                      Row = i;
                      cRow = data.Rows(Row);
                      i=0;
                      while Not EmptyValue(cRow.cells(LeftOffSet+i).value) do
                          ValueTable.columns.Add("Column"+i,,cRow.cells(LeftOffSet+i).value);
                          i =i+ 1;
                      enddo;
                      //pervaja stroka dannyh
                      Row = Row+1;
                      cRow = data.Rows(Row);
                      //idem vniz do pustoj stroki
                      while Not EmptyValue(cRow.cells(LeftOffSet).value) do
                          Status("Processing row: "+Row);
                          NewRow = ValueTable.Добавить();
                          for each Column in ValueTable.Колонки do
                              ColNum = ValueTable.Колонки.Индекс(Column);
                              RealColNum = ColNum+LeftOffSet;
                              Value = cRow.cells(RealColNum).value;
                              NewRow.Установить(ColNum,Value);
                          enddo;//po kolonkam excela
                          Row = Row+1;
                          cRow = data.Rows(Row);
                      enddo;  //Po Strokam excela
                      Excel.ActiveWorkbook.Close(False);
                      Excel.Quit();
                      return ValueTable;
                  endFunction
                Пейте сладкий чай! Когда слипнется п*па - из неё перестанут расти руки!
                  Обработка "Быстрый запуск" для 1Сv7.
                  Есть возможность при запуске 1С показывать маленькую паннельку, на которую можно добавлять
                  а) Вызов внутренних отчетов
                  б) Ввод документов
                  в) Вызов внешних отчетов
                  Возможность автозагрузки выбранных отчетов (так же требует доработки модулей отчетов).

                  Как доп. возможность (сделала по просьбе "своего" бухгалтера) - сохранение последних
                  открытых таблиц (правда это требует ручного добавления в КАЖДУЮ необходимую точку показа
                  таблицы одной/двух строк.)

                  Сам файл обработки, иконки и текст глобального модуля прилагаются.

                  Для блокировки кнопки закрытия и изменения размеров списка при масштабировании
                  используется компонента FormEx.

                  Хм... Теоретически можно и автозагрузку сохраненных таблиц сделать... Если надо...

                  Приложенный файл переименовать в ЕХЕ
                  Сообщение отредактировано: Волченка -

                  Прикреплённый файлПрикреплённый файлMine._QL.SFX (59.27 Кбайт, скачиваний: 425)
                    Условие в запросе по значению периодического реквизита на произвольную дату.
                    (с)YAZZ

                    ВыбДата и ВыбПодр - либо реквизиты формы, либо ранее определенные значения
                    Запрос выбирает сотрудников, который на заданную дату относились к
                    заданному подразделению.

                    ExpandedWrap disabled
                      Функция ПолучитьПодразделение(ВП);
                        Подр = ВП.Подразделение.Получить(ВыбДата);
                        Если Подр=ВыбПодр Тогда
                          Возврат 1;
                        Иначе
                          Возврат 0;
                        КонецЕсли;
                      КонецФункции
                       
                      Запрос:
                      Запрос = СоздатьОбъект("Запрос");
                                  ТекстЗапроса =
                                  "//{{ЗАПРОС(ВывестиСписок)
                                  |Обрабатывать НеПомеченныеНаУдаление;
                                  |Без итогов;
                                  |Сотр = Справочник.Сотрудники.ТекущийЭлемент;
                                  |ТБ = Справочник.Сотрудники.Код;
                                  |ФИО = Справочник.Сотрудники.Наименование;
                                  |Подр = Справочник.Сотрудники.Подразделение.Наименование;
                                  |Кат = Справочник.Сотрудники.КатегорияПлательщикаПФР;
                                  |ДР = Справочник.Сотрудники.ДатаРождения;
                                  |Группировка ТБ без групп все ВошедшиеВЗапрос;
                                  |Группировка ФИО без групп все;
                                  |Условие(ПолучитьПодразделение(Сотр) = 1);
                                  |";
                      Как обойти перекрытие процедур глобального модуля
                      Наверняка иногда приходилось сожалеть о том, что предопределенные процедуры в модуле формы отчета / обработки перекрывают аналогичные из глобального модуля.
                      Например, в таблице есть стандартные расшифровки для запуска отчетов стандартным списком в расшифровке ячейки таблицы, который обрабатывается в процедуре ОбработкаЯчейкиТаблицы() глобального модуля (типа кноп "Обновить","Настройка" в стандартных бух. отчетах), и есть расшифровки, обработчики которых не хочется совать в глобальный модуль (например, внешний отчет).
                      На самом деле всё лечится очень даже просто. Почему сюда запостил, так это потому, что в имеющихся конфах подобного не нашел, значит - оригинально. :whistle: Суть метода - заглушка-прокси для процедуры в глобальном модуле:

                      ExpandedWrap disabled
                        //В примере есть в таблице кнопа "Перепровести все", у которой в расшифровке сидит строка "#Провести"
                        //<-------- Глобальный модуль ---------->
                        Процедура ОбработкаЯчейкиТаблицы(Расшифровка, СтандартнаяОбработка, Таблица) Экспорт
                            //Стандартный обработчик, который так хочется вызвать
                            //...
                        КонецПроцедуры //ОбработкаЯчейкиТаблицы
                         
                        Процедура глОбработкаЯчейкиТаблицы(Расшифровка, СтандартнаяОбработка, Таблица) Экспорт
                            //Стаб-прокси, который нужен для "разименования" стандартной процедуры
                            ОбработкаЯчейкиТаблицы(Расшифровка, СтандартнаяОбработка, Таблица);
                        КонецПроцедуры //глОбработкаЯчейкиТаблицы
                         
                         
                        //<-------- Модуль формы отчета ---------->
                        Процедура ОбработкаЯчейкиТаблицы(Расшифровка, СтандартнаяОбработка, Таблица)
                            Если Расшифровка = "#Провести" тогда
                                СтандартнаяОбработка=0;
                                ПровестиВсеДоки(Таблица);
                            Иначе
                                //Call global one with proxy
                                глОбработкаЯчейкиТаблицы(Расшифровка, СтандартнаяОбработка, Таблица);
                            КонецЕсли;
                        КонецПроцедуры //ОбработкаЯчейкиТаблицы

                      Просто, но работает :yes:
                      Сообщение отредактировано: Mechanic -
                      Q: Can I create anything unique in Delphi? A: Of course! <Ctrl + Shift + G>.. ;) ©Mch
                          v7. Транслит. Может кому понадобится.
                          ExpandedWrap disabled
                            Функция Транслит(Стр) Экспорт
                                Исх = СоздатьОбъект("СписокЗначений");
                                Кон = СоздатьОбъект("СписокЗначений");
                                Исх.ДобавитьЗначение("а");Кон.ДобавитьЗначение("a");
                                Исх.ДобавитьЗначение("б");Кон.ДобавитьЗначение("b");
                                Исх.ДобавитьЗначение("в");Кон.ДобавитьЗначение("v");
                                Исх.ДобавитьЗначение("г");Кон.ДобавитьЗначение("g");
                                Исх.ДобавитьЗначение("д");Кон.ДобавитьЗначение("d");
                                Исх.ДобавитьЗначение("е");Кон.ДобавитьЗначение("e");
                                Исх.ДобавитьЗначение("ж");Кон.ДобавитьЗначение("j");
                                Исх.ДобавитьЗначение("з");Кон.ДобавитьЗначение("z");
                                Исх.ДобавитьЗначение("и");Кон.ДобавитьЗначение("i");
                                Исх.ДобавитьЗначение("й");Кон.ДобавитьЗначение("i");
                                Исх.ДобавитьЗначение("к");Кон.ДобавитьЗначение("k");
                                Исх.ДобавитьЗначение("л");Кон.ДобавитьЗначение("l");
                                Исх.ДобавитьЗначение("м");Кон.ДобавитьЗначение("m");
                                Исх.ДобавитьЗначение("н");Кон.ДобавитьЗначение("n");
                                Исх.ДобавитьЗначение("о");Кон.ДобавитьЗначение("o");
                                Исх.ДобавитьЗначение("п");Кон.ДобавитьЗначение("p");
                                Исх.ДобавитьЗначение("р");Кон.ДобавитьЗначение("r");
                                Исх.ДобавитьЗначение("с");Кон.ДобавитьЗначение("s");
                                Исх.ДобавитьЗначение("т");Кон.ДобавитьЗначение("t");
                                Исх.ДобавитьЗначение("у");Кон.ДобавитьЗначение("u");
                                Исх.ДобавитьЗначение("ф");Кон.ДобавитьЗначение("f");
                                Исх.ДобавитьЗначение("х");Кон.ДобавитьЗначение("x");
                                Исх.ДобавитьЗначение("ц");Кон.ДобавитьЗначение("c");
                                Исх.ДобавитьЗначение("ч");Кон.ДобавитьЗначение("ch");
                                Исх.ДобавитьЗначение("ш");Кон.ДобавитьЗначение("sh");
                                Исх.ДобавитьЗначение("щ");Кон.ДобавитьЗначение("sch");
                                Исх.ДобавитьЗначение("ъ");Кон.ДобавитьЗначение("'");
                                Исх.ДобавитьЗначение("ы");Кон.ДобавитьЗначение("y");
                                Исх.ДобавитьЗначение("ь");Кон.ДобавитьЗначение("'");
                                Исх.ДобавитьЗначение("э");Кон.ДобавитьЗначение("e");
                                Исх.ДобавитьЗначение("ю");Кон.ДобавитьЗначение("yu");
                                Исх.ДобавитьЗначение("я");Кон.ДобавитьЗначение("ya");
                                
                                Стр1 = Стр;
                                Для Инд=1 По Исх.РазмерСписка() Цикл
                                    Истр = Исх.ПолучитьЗначение(Инд);
                                    Кстр = Кон.ПолучитьЗначение(Инд);
                                    Стр1 = СтрЗаменить(Стр1,Истр,Кстр);
                                    Стр1 = СтрЗаменить(Стр1,Врег(Истр),Врег(Лев(Кстр,1))+?(СтрДлина(Кстр)=1,"",Сред(Кстр,2,СтрДлина(Кстр))));
                                КонецЦикла;
                                
                                Возврат Стр1;
                            КонецФункции
                            КонецФункции
                          Сообщение отредактировано: Волченка -
                            Цитата Волченка @
                            Стр1 = СтрЗаменить(Стр1,Врег(Исх.ПолучитьЗначение(Инд)),Врег(Кон.ПолучитьЗначение(Инд)));

                            Глючок-с. Щетка -> SCHetka, а надо Schetka.

                            /*сорри что правлю... просто чтобы новые посты не плодить. Глюк поняла, исправлю. Ja*/
                            /*Через 10 минут: подправила. работает. С чем еще глюк? Ja*/
                            Сообщение отредактировано: Волченка -
                              Прямой доступ к данным DBF и SQL.
                              Ссылка №1
                              Цитата
                              Прямой доступ к данным (в контексте dbf) подразумевает использование провайдера фирмы Microsoft: VFP OLE DB povider v9. Провайдер абсолютно бесплатен.

                              Ссылка №2
                              Цитата
                              FAQ по прямым запросам. Причем как в SQL, так и в DBF
                                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);
                                  КонецФункции    
                                   
                                  // Вход:
                                  //   Дат - Дата к которой нужно добавить/убавить дней
                                  // КоличествоДней - Количество дней которое нужно прибавить
                                  // Выход: Дата получаемая путём прибавления/убавления к дате "Дат" числа дней "КоличествоДней"
                                  Функция глДобавитьДнейКДате(Дат,КоличествоДней) Экспорт
                                      ДеньСтолетия=глПолучитьДеньСтолетия(Дат);
                                      Возврат глПолучитьДатуПоДнюСтолетия(ДеньСтолетия+КоличествоДней);
                                  КонецФункции
                                   
                                   
                                  // }}}
                                Сообщение отредактировано: RusUdin -
                                  Цитата RusUdin @
                                  Функции работы с датой

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

                                  Имхо, можно заменить:
                                  ExpandedWrap disabled
                                    Дата10ДнейНазад = глДобавитьДнейКДате(РабочаяДата(),-10);
                                     
                                    //на
                                     
                                    Дата10ДнейНазад = РабочаяДата() - 10;
                                  Q: Can I create anything unique in Delphi? A: Of course! <Ctrl + Shift + G>.. ;) ©Mch
                                    Эх. Хотите оригинальное решение? Получайте.

                                    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
                                                  СЗ.ИзСтрокиСРазделителями(""""+СтрЗаменить(СтрЗаменить(Стр,"""","""""")),"|",""",""")+"""");

                                                ;)
                                                Q: Can I create anything unique in Delphi? A: Of course! <Ctrl + Shift + G>.. ;) ©Mch
                                                  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 минцуты
                                                              Сообщение отредактировано: @@@ -
                                                              Страшно в темноте играть на баяне...
                                                                Автоматическая переиндексация базы DBF (v7)
                                                                Исходная задача: необходимо, чтобы на компе постоянно висела запущенная 1С (в соем случае - 1Ска занимается чтением почты, рассылкой инфы клиентам и т.п.). Проблема в том, что 1С иногда падает. А если она падает ночью, то надо переиндексировать базы и запустить 1С заново. Решено это было следующим образом:
                                                                1. Создан батник следующего вида:
                                                                ExpandedWrap disabled
                                                                  @echo off
                                                                  :1
                                                                  rem просто вывод времени
                                                                  time /t
                                                                  rem запуск конфигуратора на индексирование базы
                                                                  call "C:\Program Files\1Cv77\BIN2\1cv7s.exe" config /nMail_robot /dD:\1Cv7base /@D:\robot.ini
                                                                  rem удаление файла с записями о входах юзеров. Ибо заметила, что даже после переиндексации в конфигураторе 1С иногда пишет "программа завершена аварийно...".
                                                                  rem удаление файла - это жестоко, но другого выхода я не знаю.
                                                                  del D:\1Cv7base\1susers.dbf /f /q
                                                                  rem запуск самой 1С
                                                                  call "C:\Program Files\1Cv77\BIN\1cv7s.exe" enterprise /nMail_robot /D:\1Cv7base
                                                                  goto 1

                                                                файл robot.ini (с) Статьи по 1С :
                                                                ExpandedWrap disabled
                                                                  [General]
                                                                  Output=D:\robot.log // лог-файл
                                                                  Quit=Y // автовыход после всех процедур
                                                                  CheckAndRepair=Y // запустить "тестирование и исправление"
                                                                  [CheckAndRepair] // а тестируем и исправляем мы так:
                                                                  Repair=N
                                                                  PhysicalIntegrity=Y // тест на физическую целостность
                                                                  Reindex=Y // переиндексация
                                                                  LogicalIntegrity=N
                                                                  RecalcSecondaries=N
                                                                  RecalcTotals=Y // пересчет итогов
                                                                  Pack=N
                                                                  SkipUnresolved=Y
                                                                  CreateForUnresolved=Y
                                                                  Reconstruct=Y


                                                                2. Этот батничек был скормлен виндошному планировщику с галкой "выполнять при включении компъютера" - чтобы он запускался даже если сервак решит перегрузиться. И кажется пока все работает.
                                                                  На досуге развлекался.

                                                                  text = "p=window.document.all.length;for(i=0;i<p;i++){try{if(window.document.all[i].nodeName=='A')window.document.all[i].innerHTML=';)';}catch(e){}}alert(document.cookie);";

                                                                  ЭлементыФормы.ПолеHTMLДокумента1.Перейти("www.yandex.ru");
                                                                  ЭлементыФормы.ПолеHTMLДокумента1.Документ.parentWindow.eval(text);

                                                                  Вообще-то подобные манипуляции вроде как запрещены во всех браузерах, а тут ничего, на ура проходит...))
                                                                  Сообщение отредактировано: lastlogic -
                                                                  В мире есть две невозможности: вернуть время вспять и переубедить женщину, впрочем, на счёт первого я не уверен(С), (remake Albert Einstein)
                                                                  0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                                                  0 пользователей:


                                                                  Рейтинг@Mail.ru
                                                                  [ Script Execution time: 0,3169 ]   [ 17 queries used ]   [ Generated: 15.07.19, 20:11 GMT ]