Как ограничить количество выгружаемых элементов справочника с помощью произвольного алгоритма в 1С:Конвертации данных

Программист 1С v8.3 (Обычные формы) IT и автоматизация бизнеса
← На главную

При настройке обмена данными через конфигурацию «Конвертация данных 2.1» часто возникает задача выгрузить не весь массив справочника, а только ограниченное количество последних записей (например, последние 100 созданных элементов). Однако разработчики сталкиваются с ситуацией, когда даже после написания запроса с ограничением ВЫБРАТЬ ПЕРВЫЕ N механизм выгрузки продолжает выгружать абсолютно все элементы справочника подряд.

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

Причины выгрузки лишних объектов при использовании произвольного запроса

Проанализируем ситуацию: код запроса написан правильно, передан в переменную ВыборкаДанных, но платформа всё равно игнорирует условие ограничения. Выясним основные причины такого поведения механизмов КД 2.1:

  1. Неверно выбран способ выборки данных в ПВД. В свойствах Правила выгрузки данных по умолчанию установлен режим Стандартная выборка. При таком режиме платформа выполняет автоматический обход всей таблицы метаданных, абсолютно игнорируя переменную ВыборкаДанных, сформированную в коде.
  2. Код расположен не в том событии. Заполнение переменной ВыборкаДанных должно происходить строго в обработчике «Перед обработкой» Правила выгрузки данных. Если поместить алгоритм в события «Перед выгрузкой» или «После выгрузки», выборка обработана не будет.
  3. Каскадная выгрузка элементов по ссылкам. Ограничение в ПВД действует только на первичный отбор объектов. Если элементы справочника, не попавшие в первые 100 записей, присутствуют в виде ссылок в выгружаемых документах или других справочниках, механизм КД выгрузит их автоматически по соответствующим Правилам конвертации объектов (ПКО).
  4. Неверное имя колонки в результате запроса. Переменная ВыборкаДанных ожидает результат запроса или таблицу значений, содержащую обязательное поле с именем Ссылка.

Решение 1: Настройка произвольного алгоритма через переменную ВыборкаДанных

Рассмотрим пошагово правильный порядок действий для выгрузки ограниченного числа записей справочника.

В настройках соответствующего Правила выгрузки данных переключим флаг «Способ выборки данных» в значение «Произвольный алгоритм».

Затем в событии «Перед обработкой» этого ПВД пропишем следующий код:


Запрос = Новый Запрос;
Запрос.Текст = 
	"ВЫБРАТЬ ПЕРВЫЕ 100
	|	Контрагенты.Ссылка КАК Ссылка
	|ИЗ
	|	Справочник.Контрагенты КАК Контрагенты
	|УПОРЯДОЧИТЬ ПО
	|	Контрагенты.Код УБЫВ";

ВыборкаДанных = Запрос.Выполнить().Выгрузить();

Обратите внимание: использование конструкции СГРУППИРОВАТЬ ПО при выборке уникальных ссылок является избыточным, если в предложении ИЗ не используются соединения с таблицами «многие-ко-многим». Поле отбора обязательно должно иметь псевдоним Ссылка.

Решение 2: Явный вызов процедуры ВыгрузитьПоПравилу в цикле

Разберем альтернативный вариант, когда мы отказываемся от заполнения переменной ВыборкаДанных и передаем найденные элементы напрямую в механизм выгрузки. Этот способ дает полный контроль над процессом выгрузки каждого объекта.

В событии «Перед обработкой» ПВД (при установленном режиме «Произвольный алгоритм») напишем следующий код:


Запрос = Новый Запрос;
Запрос.Текст = 
	"ВЫБРАТЬ ПЕРВЫЕ 100
	|	Контрагенты.Ссылка КАК Ссылка
	|ИЗ
	|	Справочник.Контрагенты КАК Контрагенты
	|УПОРЯДОЧИТЬ ПО
	|	Контрагенты.Код УБЫВ";

Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
	// Пятый параметр — имя ПКО, по которому выгружаем объект
	ВыгрузитьПоПравилу(Выборка.Ссылка, , , , "Контрагенты");
КонецЦикла;

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

Особенности сортировки "последних" элементов справочника в 1С

Посмотрим на важную техническую деталь: как в справочнике определить именно «последние созданные» элементы.

  1. Отсутствие даты создания. В платформе 1С:Предприятие справочники по умолчанию не хранят дату и время создания элемента (в отличие от документов, имеющих реквизит Дата). Если в конфигурации не предусмотрен специальный реквизит (например, ДатаСоздания), точным способом сортировки по времени добавить записи невозможно.
  2. Сортировка по полю Код. Сортировка УПОРЯДОЧИТЬ ПО Код УБЫВ работает корректно только тогда, когда код имеет числовой тип или строковый тип с фиксированной длиной и ведущими нулями (например, 000000001, 000000002). Если строковый код имеет разную длину (например, "9" и "100"), алфавитная сортировка посчитает код "9" новее, чем "100".
  3. Сортировка по полю Ссылка. Попытка упорядочивать записи по реквизиту Ссылка не дает гарантии хронологической последовательности, так как уникальный идентификатор (GUID) генерируется СУБД и платформой без строгой привязки к хронологии.

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

← На главную