Подсистема "COMExchange", консоль запросов, сервис обработки выборки запроса: корректируем регистры или «Берём банк, кассу, экспроприируем экспроприаторов».

31.03.13

Разработка - Инструментарий разработчика

На примере шуточного примера продемонстрированы не шуточные возможности консоли запросов в составе подсистемы "COMExchange" для работы с регистрами, подчинёнными регистратору («обнуление» регистров, ввод начальных итогов (сведений), корректировка итогов).
Только та революция чего-нибудь стоит, у которой есть своя 1С.
(из полного собрания сочинений)

 





Ранее в публикации //infostart.ru/public/177179/ был описан сервис обработки выборки запроса подсистемы
«COMExchange», позволяющий выполнять сложные действия с данными в информационной базе. Этот сервис реализован
на поддержке пользовательских событий «ПередВыборкой», «Выборка» и «ПослеВыборки» в специальной форме
«ОбработкаВыборки»
консоли запросов (смотри детали в описании консоли), основной смысл которых заключается
в выполнении заданного пользователем кода на языке 1С, определяющего алгоритм обработки данных.


В настоящей статье описываются возможности сервиса для работы с регистрами, подчинёнными регистратору.


Описание задачи:

В архиве файла поставки в папке .\COMExchange-8x\Sampels\ находится файл (скачать)
!ВеликаяОктябрьскаяРеволюция.selx с примером запросов, выполняющих следующие действия:

  1. «Обнуляются» итоги на текущую дату следующих регистров накопления:
    «ДенежныеСредства»
    , «РасчетыСКонтрагентами», «ВзаиморасчетыСКонтрагентами»;
  2. Для регистра сведений «ЦеныНоменклатурыКонтрагентов» для среза последних на текущую дату
    в регистр прописываются пустые значения всех ресурсов;
  3. Для регистра бухгалтерии «Хозрасчётный» (если он есть в конфигурации) остатки по счетам
    01, 02, 03, 04, 05, 50, 51, 52, 55, 60, 62, 75 и 76  
    списываются с корреспонденцией на счёт с кодом “ВОР” и наименованием “Великая Октябрьская Революция”.
    Если такого счета в плане счетов нет, он создаётся.
  4. Для записи наборов записей регистров в качестве регистратора используется ссылка на типовой документ вида
    «КорректировкаЗаписейРегистра»
    . После записи документ-регистратор открывается на просмотр (Рис.4).

Запросы из примера работают в типовых конфигурациях УТ-10.3, УПП-1.2, УПП-1.3 (обычное приложение).
При этом в конфигурациях УПП-1.2, УПП-1.3 можно посмотреть «финансовый результат экспроприации»
с помощью стандартных бухгалтерских отчетов (Рис.5, Рис.6).

Для описываемого примера установка подсистемы «COMExchange» в полном объёме не требуется,
достаточно обработки “Консоль запросов 1С + ADO”, сохранённой в виде внешней обработки. 
Рекомендуемая версия консоли 8.1.1.2-а.Посмотреть версию консоли можно в описании или в меню «Действия» (Рис.1).

Описываемый пример является задачей коррекции регистров учёта на основании данных из самой информационной базы 1С.
Другой распространённой задачей является загрузка начальных итогов (сведений) по регистрам из внешних файлов.

Эта задача так же решается с использованием описанной в примере методики.
Только таблица движений регистров в запросах строится не по данным из информационной базы 1С, а по данным,
загруженных из внешнего файла во временную таблицу и синхронизованных с объектами в базе 1С. 

Как можно загрузить и синхронизовать данные из внешнего файла описано в статье //infostart.ru/public/177179/
на примере загрузки курса валюты из файла *.xls, *.dbf.


Комментарии к запросам (Рис.2)
:

  1. «Корневой» запрос «ВеликаяОктябрьскаяРеволюция» - не выполняет никаких действий, он просто открывает форму «ОбработкаВыборки».
    В этой форме после нажатия на кнопку «Обработать» (Рис.4) обработчики пользовательских событий выполняются все остальные действия:
    получение необходимых выборок запросов и запись документа-регистратора с наборами записей регистров.
  2. Запрос «ДвиженияУТ-10» - выполняет пакет запросов, формирующий таблицы движений по регистрам для конфигурации УТ-10.3;
  3. Запрос «ДвиженияУПП» - выполняет пакет запросов, формирующий таблицы движения по регистрам для конфигурации УПП-1.2 и УПП-1.3. (включая данные бухучета);
  4. Запрос «ДанныеБухУчета» - формирует временные таблицы по данным бухгалтерских итогов, используемые в запросе «ДвиженияУПП»
    для формирования движений по регистру бухгалтерии «Хозрасчетный». Перед выполнением пакета запросов проверяется наличие в плане счетов счета “ВОР”.
    При необходимости такой счёт создаётся (Рис.4);
  5. Запрос «СчетаЭкспроприации» - укладывает во временную таблицу список бухгалтерских счетов, по которым будут списываться остатки;

     Остальные запросы играют вспомогательную роль.

 

Комментарии к коду обработчиков пользовательских событий:

Модули обработчиков событий обработки получены модификацией кода, установленного при авто-заполнении
по шаблону «Корректировка регистров» (Рис.3). Полный текст кода смотрите ниже в приложении статье.

         
1. Событие ПередВыборкой():
         
          Сначала по метаданным конфигурации вычисляется имя запроса, формирующего набор таблиц движений по регистрам. 
          Для непредусмотренной конфигурации обработка прерывается с установкой флага Отказ = Истина и выводом сообщения.
          Далее в соответствии ДополнительныеСвойства устанавливаются параметры обработки, используемые в событии ПослеВыборки():

  • Имя запроса, формирующего данные для движений в регистрах;
  • Флаг ВыборкаОбновить = Истина (для обновления выборки запроса);
  • Флаг ВыборкаПропустить = Истина (для пропуска события Выборка());
  • Вид документа регистратора – «КорректировкаЗаписейРегистра»;
  • Имя запроса, значения параметров которого используются для установки свойств документа-регистратора
    (в рассматриваемом примере не указывается);
  • Номер и дата документа (00000000001 от 07.11.2017);
  • Содержание комментария документа-регистратора;

    Затем заполняется массив имён регистров, для которых будут записываться наборы движений. 
    Важен порядок следования имён в этом массиве! 
    Он должен соответствовать порядку отдельных «батчей» в пакете запросов, формирующем набор таблиц движений по регистрам.

  • 2.  Событие Выборка():
    В шаблоне авто-заполнения «Корректировка регистров» это событие не используется.
    При выполнении оно фактически пропускается одновременной установкой в событии ПередВыборкой()
    аргумента СтандартнаяОбработка = Ложь и параметра обработки ВыборкаПропустить = Истина.
    Модуль события содержит комментарии с информацией справочного характера.

  • 3.  Событие ПослеВыборки():
    Содержит универсальный код, выполняющий с учётом установленных в событии ПередВыборкой()  параметров  следующие действия:
  • Сначала по переданному имени получается результат запроса, содержащий набор таблиц с движениями регистров.
    Если имя не задано – используется результат текущего запроса. При необходимости результат запроса обновляется.
  • Далее по переданному номеру и дате ищется документ-регистратор, указанного вида. Если документ не находится – создаётся новый.
    Если номер не указан – номер устанавливается авто-нумерацией.
  • Затем для найденного документа – очищаются табличные части и движения. Если документ помечен на удаление – пометка удаления снимается.
  • Потом как для нового, так и для существующего документа устанавливаются свойства по значениям параметров запроса,
    с указанным именем, если это имя задано. Также заново устанавливается ответственный и формируется комментарий документа.
  • И наконец, заполняются движения документа-регистратора для регистров, перечисленных в массиве имен.
    В наборы записей движений документа для перечисленных в массиве регистров загружаются таблицы значений с движениями из результата запроса.
    Таблицы движений получаются из результата запроса по индексу в массиве имен регистров.
    При заполнении движений также согласованно заполняются табличные части документа.
  • В завершение после удачной записи документа он открывается на просмотр.


Благодарности
:

Выражаю огромную благодарность alexk-is за его замечательную обработку,
без которой оформление приложения к этой статье вызвало бы определенные сложности. 

Приложение (код обработчиков событий):

// ПередВыборкой(Отказ, СтандартнаяОбработка)
    // ********** КОРРЕКТИРОВКА ЗАПИСЕЙ РЕГИСТРОВ, ПОДЧИНЕННЫХ РЕГСТРАТОРАМ **********
    // флагОК, стПарам, Объект, пр0 ... пр9 и ф0, ф1 - переменные модуля формы

    // В выборках пакета запросов требуется сформировать полные таблицы значений
    // с движениями корректируемых регистров, включая поля Период и ВидДвижения !
    // Соответствие таблиц движений - по индексу в списке имен регистров

   
СтандартнаяОбработка = Ложь;
   
флагОК = Ложь;      // предохранитель
   
флагОК = Истина;    // не уверен - не снимай!!!
   
ВыборкаЗапрос = "";
   
СвойстваЗапрос = "";

   
// только для УТ10.3, УПП1.2, УПП1.3 !!!
   
МетаданныеИмя = Метаданные.Имя; МетаданныеВерсия = Метаданные.Версия;
    Если
МетаданныеИмя = "УправлениеТорговлей" Тогда
        Если
Лев(МетаданныеВерсия,3) = "10." Тогда
           
ВыборкаЗапрос = "ДвиженияУТ-10";
        КонецЕсли;
    ИначеЕсли
МетаданныеИмя = "УправлениеПроизводственнымПредприятием" Тогда
       
ВыборкаЗапрос = "ДвиженияУПП";
    КонецЕсли;

    Если
ВыборкаЗапрос = "" Тогда Отказ = Истина;
       
Сообщить("Непредусмотренная конфигурация базы данных: '"+МетаданныеИмя+"("+МетаданныеВерсия+")'",СтатусСообщения.Информация);
       
Отказ = Истина;
        Перейти
~Возврат;
    КонецЕсли;

   
ДополнительныеСвойства = Новый Соответствие;
   
ДополнительныеСвойства["ВыборкаЗапрос"] = ВыборкаЗапрос;        // имя запроса выборки данных (по умолчанию - текущий запрос)
   
ДополнительныеСвойства["ВыборкаОбновить"] = Истина;             // флаг обновления выборки данных
   
ДополнительныеСвойства["ВыборкаПропустить"] = Истина;           // пропускаем событие выборка
   
ДополнительныеСвойства["СвойстваЗапрос"] = СвойстваЗапрос;      // имя запроса для установки свойств документа-регистратора

   
ДополнительныеСвойства["ИмяРегистратора"] = "КорректировкаЗаписейРегистров";
   
//ДополнительныеСвойства["ИмяРегистратора"] = "ОперацияБух";

   
Комментарий = "Берем банк и кассу, Экспроприируем экспроприаторов.";
   
НомерДок = "00000000001"; //
   
ДатаДок = '2017-11-07';

   
ДополнительныеСвойства["Комментарий"] = Комментарий;
   
ДополнительныеСвойства["НомерДок"] = НомерДок;
   
ДополнительныеСвойства["ДатаДок"] = ДатаДок;

   
// формируем список имен регистров, соответствие таблиц движений в результате пакета запросов - по индексу в списке
   
СписокДвижений = Новый Массив;
   
ДополнительныеСвойства["СписокДвижений"] = СписокДвижений;
   
СписокДвижений.Добавить("ДенежныеСредства");
   
СписокДвижений.Добавить("ЦеныНоменклатурыКонтрагентов");
   
СписокДвижений.Добавить("РасчетыСКонтрагентами");
   
СписокДвижений.Добавить("ВзаиморасчетыСКонтрагентами");
    Если
ВыборкаЗапрос = "ДвиженияУПП" Тогда
       
СписокДвижений.Добавить("Хозрасчетный");
    КонецЕсли;
~Возврат:



// Выборка(Отказ)
    // тзВыборкаЗапроса - обрабатываемая таблица выборки запроса,
    // Выборка          - обрабатываемая строка выборки запроса.
    // По умолчанию обрабатывается результат запроса, показанный в форме консоли,
    // при выполнении функции ЗапросВыполнить() - автоматически не обновляется!
    // В событии ПередВыборкой() тзВыборкаЗапроса можно переопределить, если СтандартнаяОбработка = Ложь



// ПослеВыборки(Отказ)
    // флагОК, стПарам, Объект, пр0 ... пр9 и ф0, ф1 - переменные модуля формы

   
Если флагОК <> Истина Тогда
       
Отказ = Истина;
        Перейти
~Возврат;
    КонецЕсли;

   
ВыборкаЗапрос = СокрЛП(ДополнительныеСвойства["ВыборкаЗапрос"]);
    Если
ПустаяСтрока(ВыборкаЗапрос) Тогда
       
ВыборкаЗапрос = ЭтотЗапрос;
    КонецЕсли;

   
Отказ = Ложь;
   
СписокДвижений = ДополнительныеСвойства["СписокДвижений"];
    Если
СписокДвижений.Количество() = 0 Тогда
       
Сообщить("Не задан список корректируемых регистров !", СтатусСообщения.Внимание);
       
Отказ = Истина;
    КонецЕсли;
    Если
Отказ = Ложь И ДополнительныеСвойства["ВыборкаОбновить"] = Истина Тогда
       
Рез = Обработка.ЗапросВыполнить(ВыборкаЗапрос,);
        Если
Рез <> Истина Тогда
           
Отказ = Истина;
        КонецЕсли;
    КонецЕсли;
    Если
Отказ <> Истина Тогда
       
тзРезультат = Обработка.РезультатПолучить(ВыборкаЗапрос,0,"Список");
        Если
Обработка.ЛокIsEmpty(ВыборкаЗапрос.тзРезультаты,Истина) = Истина Тогда
           
Сообщить("Таблица с результатами выполнения пакета запросов - пустая !", СтатусСообщения.Внимание);
           
Отказ = Истина;
        КонецЕсли;
    КонецЕсли;

    Если
Отказ = Истина Тогда
        Перейти
~Возврат;
    КонецЕсли;

   
СвойстваЗапрос = СокрЛП(ДополнительныеСвойства["СвойстваЗапрос"]);
   
стПарам = Неопределено;
    Если НЕ
ПустаяСтрока(СвойстваЗапрос) Тогда
       
стПарам = ПараметрыЗапроса(СвойстваЗапрос,);
       
//ViewValue(стПарам,""Структура параметров запроса '""+СвойстваЗапрос+""' для установки свойств документа-регистратора"")
   
КонецЕсли;

   
ИмяРегистратора = ДополнительныеСвойства["ИмяРегистратора"];
   
Комментарий = ДополнительныеСвойства["Комментарий"];
   
НомерДок = ДополнительныеСвойства["НомерДок"];
   
ДатаДок = ДополнительныеСвойства["ДатаДок"]; ДатаДок = ?(ЗначениеЗаполнено(ДатаДок),ДатаДок,ТекущаяДата());

   
МетаРегистратор = Метаданные.Документы[ИмяРегистратора];

   
Ссылка = Документы[ИмяРегистратора].НайтиПоНомеру(НомерДок,?(ЗначениеЗаполнено(ДатаДок),ДатаДок,Неопределено));
    Если
ЗначениеЗаполнено(Ссылка) Тогда
       
Объект = Ссылка.ПолучитьОбъект();
        Если
Объект.ПометкаУдаления Тогда
           
// сбрасываем пометку удаления
           
Объект.ПометкаУдаления = Ложь;
        КонецЕсли;
        Если
Объект.Проведен Тогда
           
// сбрасываем флаг проведения
           
Объект.Проведен = Ложь;
        КонецЕсли;

       
// сбрасываем флаг заполнения по конкретным документам
       
Если ИмяРегистратора = "КорректировкаЗаписейРегистров" Тогда
           
Объект.ИспользоватьЗаполнениеДвижений = Ложь;
        Иначе
           
СпособЗаполнения = "Вручную";
        КонецЕсли;

       
// для существующего документа очищаем табличные части
       
Для каждого МетаТЧ Из МетаРегистратор.ТабличныеЧасти Цикл
           
Объект[МетаТЧ.Имя].Очистить();
        КонецЦикла;

       
// для существующего документа чистим движения
       
Для каждого Движение Из Объект.Движения Цикл
           
Движение.Очистить();
        КонецЦикла;
       
Объект.Дата = ДатаДок;
    Иначе
       
Объект = Документы[ИмяРегистратора].СоздатьДокумент();
       
Объект.Дата = ДатаДок;
        Если
ПустаяСтрока(НомерДок) Тогда
           
Объект.УстановитьНовыйНомер("");
        Иначе
           
Объект.Номер = НомерДок;
        КонецЕсли;
    КонецЕсли;

    Если
стПарам <> Неопределено Тогда
       
ЗаполнитьЗначенияСвойств(Объект, стПарам);
    КонецЕсли;

   
Объект.Ответственный = глЗначениеПеременной("глТекущийПользователь");
   
Объект.Комментарий = Комментарий + "; Выполненно: "+ТекущаяДата();

   
ИндексБатча = 0;
    Для каждого
ИмяРег Из СписокДвижений Цикл
       
// загружаем таблицу движений из результата выполнения пакета запросов по индексу регистра в списке
       
тзРезультат = Обработка.РезультатПолучить(ВыборкаЗапрос,ИндексБатча,"Список",Истина);
       
Объект.Движения[ИмяРег].Загрузить(тзРезультат);

       
// заполняем табличные части
       
МетаРег1 = Метаданные.РегистрыСведений.Найти(ИмяРег);
       
МетаРег2 = Метаданные.РегистрыНакопления.Найти(ИмяРег);
       
МетаРег3 = Метаданные.РегистрыБухгалтерии.Найти(ИмяРег);
       
МетаРег4 = Метаданные.РегистрыРасчета.Найти(ИмяРег);
        Если
МетаРег1 <> Неопределено Тогда
           
Стр = Объект.ТаблицаРегистровСведений.Добавить();
           
Стр.Имя = ИмяРег;
           
Стр.Представление = МетаРег1.Синоним;
        ИначеЕсли
МетаРег2 <> Неопределено Тогда
           
Стр = Объект.ТаблицаРегистровНакопления.Добавить();
           
Стр.Имя = ИмяРег;
           
Стр.Представление = МетаРег2.Синоним;
        ИначеЕсли
МетаРег3 <> Неопределено Тогда
            Если
ИмяРегистратора = "КорректировкаЗаписейРегистров" Тогда
               
Стр = Объект.ТаблицаРегистровБухгалтерии.Добавить();
               
Стр.Имя = ИмяРег;
               
Стр.Представление = МетаРег3.Синоним;
            КонецЕсли;
        ИначеЕсли
МетаРег4 <> Неопределено Тогда
        КонецЕсли;

       
ИндексБатча = ИндексБатча + 1;
    КонецЦикла;

   
Еррор = Ложь;
    Попытка
       
Объект.Проведен = Истина;
       
Объект.Записать(РежимЗаписиДокумента.Запись,РежимПроведенияДокумента.Неоперативный);
    Исключение
       
Еррор = Истина;
       
Сообщить(ОписаниеОшибки(),СтатусСообщения.Важное);
    КонецПопытки;

    Если
Еррор = Ложь Тогда
       
Объект.ПолучитьФорму(,,).Открыть();
    КонецЕсли;

   
Объект = Неопределено;

~Возврат:


См. также

Infostart Toolkit: Инструменты разработчика 1С 8.3 на управляемых формах

Инструментарий разработчика Роли и права Запросы СКД Платформа 1С v8.3 Управляемые формы Запросы Система компоновки данных Конфигурации 1cv8 Платные (руб)

Набор инструментов программиста и специалиста 1С для всех конфигураций на управляемых формах. В состав входят инструменты: Консоль запросов, Консоль СКД, Консоль кода, Редактор объекта, Анализ прав доступа, Метаданные, Поиск ссылок, Сравнение объектов, Все функции, Подписки на события и др. Редактор запросов и кода с раскраской и контекстной подсказкой. Доработанный конструктор запросов тонкого клиента. Продукт хорошо оптимизирован и обладает самым широким функционалом среди всех инструментов, представленных на рынке.

13000 руб.

02.09.2020    120006    656    389    

702

Infostart PrintWizard

Пакетная печать Печатные формы Инструментарий разработчика Платформа 1С v8.3 Запросы 1С:Зарплата и кадры бюджетного учреждения 1С:Конвертация данных 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 Платные (руб)

Инструмент, позволяющий абсолютно по-новому взглянуть на процесс разработки печатных форм. Благодаря конструктору можно значительно снизить затраты времени на разработку печатных форм, повысить качество и "прозрачность" разработки, а также навести порядок в многообразии корпоративных печатных форм.

18000 руб.

06.10.2023    7026    20    6    

37

Infostart УДиФ: Управление данными и формами

Инструменты администратора БД Инструментарий разработчика Роли и права Платформа 1С v8.3 Конфигурации 1cv8 Россия Платные (руб)

Расширение позволяет без изменения кода конфигурации выполнять проверки при вводе данных, скрывать от пользователя недоступные ему данные, выполнять код в обработчиках. Не изменяет данные конфигурации, легко устанавливается практически на любую конфигурацию на управляемых формах.

10000 руб.

10.11.2023    3263    10    1    

31

SALE! 30%

PowerTools

Инструментарий разработчика Инструменты администратора БД Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Россия Платные (руб)

Универсальный инструмент программиста для администрирования конфигураций. Сборник наиболее часто используемых обработок под единым интерфейсом.

3600 2520 руб.

14.01.2013    177369    1071    0    

846

Многопоточность. Универсальный «Менеджер потоков» 2.1

Инструментарий разработчика Платформа 1С v8.3 Конфигурации 1cv8 Россия Платные (руб)

Восстановление партий или взаиморасчетов, расчет зарплаты, пакетное формирование документов или отчетов - теперь все это стало доступнее. * Есть желание повысить скорость работы медленных алгоритмов! Но... * Нет времени думать о реализации многопоточности? * о запуске и остановке потоков? * о поддержании потоков в рабочем состоянии? * о передаче данных в потоки и как получить ответ из потока? * об организации последовательности? Тогда ЭТО - то что надо!!!

5000 руб.

07.02.2018    99210    239    97    

296

[ЕХТ] Фреймворк для Расширений 1С

Инструментарий разработчика Платформа 1С v8.3 Управляемые формы Платные (руб)

"Фреймворк для Расширений 1С" это универсальное и многофункциональное решение, упрощающее разработку и поддержку создаваемых Расширений. Поставляется в виде комплекта из нескольких Расширений с открытым исходным кодом. Работает в любых Конфигурациях в режиме Управляемого приложения с режимом совместимости 8.3.12 и выше без необходимости внесения изменений в Конфигурацию.

3000 руб.

27.08.2019    17928    6    8    

38

1С HTML Шаблоны / HTML Templates

Инструментарий разработчика Платформа 1С v8.3 Конфигурации 1cv8 Платные (руб)

Быстрая и удобная обработка для работы с шаблонами HTML. Позволяет легко и быстро формировать код HTML.

2040 руб.

27.12.2017    27952    3    10    

14

Выполнение произвольного кода или запроса с параметрами через Web-сервис (замена COM-подключений)

Инструментарий разработчика Обмен между базами 1C Платформа 1С v8.3 Платные (руб)

В процессе работы в 1С часто возникает потребность получить данные из другой базы.  Обычно это делается через COM-соединение, и время выполнения запроса при этом оставляет желать лучшего. В данной публикации представлено универсальное решение, позволяющее практически моментально выполнить произвольный код или запрос с параметрами в другой информационной базе через Web-сервис.

2400 руб.

24.09.2019    23495    15    15    

31
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. yuraos 991 31.03.13 18:39 Сейчас в теме
Наш паровоз вперед летит,
В Инфостарте остановка ...


Доброе время суток!
Поздравляю всех с международным днем веселья!!!

Описанный в статье пример является шуточным и чисто демонстрационным.
Но инструменты на которых он сделан - это всерьёз ... и надеюсь надолго!
2. andrewks 1367 31.03.13 21:02 Сейчас в теме
пока не знаю, надо оно мне, или нет, но работа проделана масштабная :)
3. yuraos 991 06.04.13 06:44 Сейчас в теме
Всем доброе время суток!!!
---
Примеры запросов, выполняющих очистку
независимых регистров сведений
анонсированы в комментариях к следующим статьям:
1) Очистка регистра "Версии объектов"
2) Очистка регистров сведений для удаления данных
4. gull22 95 15.04.13 15:25 Сейчас в теме
Мне понравилось Ваше решение по созданию образцов применения Вашей системы.
5. yuraos 991 09.01.14 20:21 Сейчас в теме
6. yuraos 991 09.01.14 20:23 Сейчас в теме
Оставьте свое сообщение