При настройке обмена данными через конфигурацию «Конвертация данных 2.1» часто возникает задача выгрузить не весь массив справочника, а только ограниченное количество последних записей (например, последние 100 созданных элементов). Однако разработчики сталкиваются с ситуацией, когда даже после написания запроса с ограничением ВЫБРАТЬ ПЕРВЫЕ N механизм выгрузки продолжает выгружать абсолютно все элементы справочника подряд.
В этой статье мы подробно разберем, как правильно составить запрос в Правилах выгрузки данных (ПВД), какие настройки формы и события необходимо проверить, а также выясним особенности сортировки элементов справочника в платформе 1С:Предприятие.
Проанализируем ситуацию: код запроса написан правильно, передан в переменную ВыборкаДанных, но платформа всё равно игнорирует условие ограничения. Выясним основные причины такого поведения механизмов КД 2.1:
Стандартная выборка. При таком режиме платформа выполняет автоматический обход всей таблицы метаданных, абсолютно игнорируя переменную ВыборкаДанных, сформированную в коде.ВыборкаДанных должно происходить строго в обработчике «Перед обработкой» Правила выгрузки данных. Если поместить алгоритм в события «Перед выгрузкой» или «После выгрузки», выборка обработана не будет.ВыборкаДанных ожидает результат запроса или таблицу значений, содержащую обязательное поле с именем Ссылка.Рассмотрим пошагово правильный порядок действий для выгрузки ограниченного числа записей справочника.
В настройках соответствующего Правила выгрузки данных переключим флаг «Способ выборки данных» в значение «Произвольный алгоритм».
Затем в событии «Перед обработкой» этого ПВД пропишем следующий код:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 100
| Контрагенты.Ссылка КАК Ссылка
|ИЗ
| Справочник.Контрагенты КАК Контрагенты
|УПОРЯДОЧИТЬ ПО
| Контрагенты.Код УБЫВ";
ВыборкаДанных = Запрос.Выполнить().Выгрузить();
Обратите внимание: использование конструкции СГРУППИРОВАТЬ ПО при выборке уникальных ссылок является избыточным, если в предложении ИЗ не используются соединения с таблицами «многие-ко-многим». Поле отбора обязательно должно иметь псевдоним Ссылка.
Разберем альтернативный вариант, когда мы отказываемся от заполнения переменной ВыборкаДанных и передаем найденные элементы напрямую в механизм выгрузки. Этот способ дает полный контроль над процессом выгрузки каждого объекта.
В событии «Перед обработкой» ПВД (при установленном режиме «Произвольный алгоритм») напишем следующий код:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 100
| Контрагенты.Ссылка КАК Ссылка
|ИЗ
| Справочник.Контрагенты КАК Контрагенты
|УПОРЯДОЧИТЬ ПО
| Контрагенты.Код УБЫВ";
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
// Пятый параметр — имя ПКО, по которому выгружаем объект
ВыгрузитьПоПравилу(Выборка.Ссылка, , , , "Контрагенты");
КонецЦикла;
В этом случае платформа не выполняет стандартный обход, а сразу производит выгрузку переданных элементов по указанному правилу конвертации.
Посмотрим на важную техническую деталь: как в справочнике определить именно «последние созданные» элементы.
Дата). Если в конфигурации не предусмотрен специальный реквизит (например, ДатаСоздания), точным способом сортировки по времени добавить записи невозможно.УПОРЯДОЧИТЬ ПО Код УБЫВ работает корректно только тогда, когда код имеет числовой тип или строковый тип с фиксированной длиной и ведущими нулями (например, 000000001, 000000002). Если строковый код имеет разную длину (например, "9" и "100"), алфавитная сортировка посчитает код "9" новее, чем "100".Ссылка не дает гарантии хронологической последовательности, так как уникальный идентификатор (GUID) генерируется СУБД и платформой без строгой привязки к хронологии.Рекомендация: если вам требуется постоянно выгружать строго последние созданные элементы справочника, добавьте в конфигурацию-источник реквизит ДатаСоздания, заполняемый при записи нового объекта в событии ПередЗаписью, и выполняйте сортировку именно по этому полю.