При переносе данных из конфигурации «1С:Торговля и Склад 7.7» в «1С:Бухгалтерию» с помощью правил, созданных в конфигурации «Конвертация данных 2.1», разработчики часто сталкиваются с необходимостью отфильтровать выгружаемые документы. Стандартная колонка «Отбор» в обработке выгрузки V77Exp.ert имеет существенные ограничения, не позволяя интерактивно задавать сложные условия вроде «Не равно» или «В списке».
Разберем причины такого поведения платформы 1С 7.7, важные конфигурационные нюансы и несколько способов реализации произвольных условий отбора.
В платформе «1С:Предприятие 7.7» отсутствуют Система компоновки данных и Построитель отчета, знакомые разработчикам по платформе 1С 8. Механизм интерактивного отбора в V77Exp.ert работает исключительно на базе платформенного признака «Отбор по реквизиту», заданного в метаданных конфигуратора. По этой причине штатный отбор предоставляет только один тип сравнения — точное равенство («Равно») одному конкретному значению. Построить логические цепочки «ИЛИ», указать список значений или инвертировать условие («Не равно») через стандартное табличное поле невозможно.
Важная особенность конфигурации «Торговля и Склад 7.7»: в типовой конфигурации отсутствует справочник «Организации». Список собственных юридических лиц ведется в справочнике Фирмы. Соответственно, в реквизитах шапки документов реквизит называется Фирма, а не Организация. Попытка написать условие вида Источник.Организация приведет к ошибке выполнения («Поле агрегатного объекта не обнаружено»).
Специфика загрузки кода правил в 1С 7.7: в отличие от восьмой версии платформы, где программный код правил выгрузки может компилироваться динамически прямо из XML-файла, в 7.7 все обработчики событий должны быть физически встроены в модуль обработки. При выгрузке правил из «Конвертации данных» создаются два файла: файл правил с расширением XML и текстовый файл модуля выгрузки (обычно МодульВыгрузки.txt). Чтобы написанный код обработчиков вступил в силу, необходимо открыть V77Exp.ert в Конфигураторе 7.7 и обновить текст модуля содержимым созданного файла, иначе возникнет ошибка отсутствия функции ПКО_....
Рассмотрим универсальный вариант, позволяющий пользователю перед запуском выгрузки самостоятельно выбирать одну или несколько фирм, а также задавать логику отбора. Настроим параметры в «Конвертации данных» и напишем условие в обработчике.
Имя: СписокФирм
Тип данных: СписокЗначений
Флаг: взводим флаг «Диалог» (это позволит отобразить параметр в форме обработки V77Exp.ert).
РежимОтбора (с флагом «Диалог»), где 1 будет означать «Только выбранные», а 2 — «Исключать выбранные».
Если Параметры.СписокФирм.РазмерСписка() > 0 Тогда
ВходитВСписок = Параметры.СписокФирм.Принадлежит(Источник.Фирма);
// Режим 1: Выгружать только те, что в списке
Если (Параметры.РежимОтбора = 1) И (ВходитВСписок = 0) Тогда
Отказ = 1;
КонецЕсли;
// Режим 2: Выгружать все, кроме выбранных (условие "НЕ РАВНО")
Если (Параметры.РежимОтбора = 2) И (ВходитВСписок = 1) Тогда
Отказ = 1;
КонецЕсли;
КонецЕсли;
Если Источник.ПометкаУдаления() = 1 Тогда
Отказ = 1;
КонецЕсли;
V77Exp.ert в Конфигураторе 7.7.Обратите внимание: в синтаксисе встроенного языка 1С 7.7 флаг отказа устанавливается числовым значением Отказ = 1;, а проверка на пометку удаления выполняется через метод ПометкаУдаления().
Проанализируем производительность предыдущего способа. При установке флага Отказ = 1 в событии «Перед выгрузкой» ПКО обработка последовательно перебирает абсолютно все документы базы за указанный период и только затем отсекает лишние. На базах с большим документооборотом это приводит к существенному замедлению выгрузки.
Чтобы ускорить процесс, переведем выборку данных на уровень Правил выгрузки данных (ПВД) с использованием штатных механизмов выборки 1С 7.7:
Запрос или метода ВыбратьДокументы():
ВыборкаДокументов = СоздатьОбъект("Документ.Реализация");
ВыборкаДокументов.ВыбратьДокументы(ДатаНачала, ДатаОкончания);
Пока ВыборкаДокументов.ПолучитьДокумент() = 1 Цикл
// Пропускаем помеченные на удаление
Если ВыборкаДокументов.ПометкаУдаления() = 1 Тогда
Продолжить;
КонецЕсли;
// Проверяем условие "НЕ РАВНО" для конкретной организации
Если ВыборкаДокументов.Фирма = глНашОсновнойЭлемент Тогда
Продолжить;
КонецЕсли;
// Если документ удовлетворяет условиям, передаем его на выгрузку по ПКО
ВыгрузитьПоПравилу(ВыборкаДокументов, , , , "РеализацияТоваровУслуг");
КонецЦикла;
Такой подход исключает холостой прогон объектов через общие механизмы конвертации и передает на обработку только те документы, которые полностью соответствуют заданным условиям.
Если правила конвертации часто обновляются и вам неудобно каждый раз повторно генерировать модуль выгрузки с новыми параметрами, можно вынести управление отбором прямо на форму внешней обработки:
V77Exp.ert в Конфигураторе «1С:Предприятие 7.7».ФильтрФирм) и флажок «Исключать выбранные» (идентификатор ИсключатьФирмы).Использование диалоговых параметров в сочетании со списком значений или перенос логики в произвольный алгоритм ПВД полностью решает задачу построения отборов любой сложности при экспорте из 1С 7.7.