В процессе настройки обмена данными между конфигурациями 1С:Предприятие 7.7 часто возникает ситуация, когда запрос, идеально работающий в консоли, перестает возвращать данные внутри правил конвертации. Рассмотрим типичный случай: вы создали правило конвертации объектов (ПКО) для документа "Ввод начальных остатков", написали запрос для получения данных из регистра партий, но при выгрузке выборка оказывается пустой, хотя вы уверены, что данные должны быть.
Проанализируем ситуацию на примере реального кода и разберем по шагам, как диагностировать и решить подобную проблему.
Представим, что у нас есть правило, которое должно выгружать остатки товаров по партиям, привязанным к конкретному документу поступления. В обработчике события "Перед обработкой" правила конвертации написан следующий код:
Запрос = СоздатьОбъект("Запрос");
ТекстЗапроса =
"//{{ЗАПРОС
|Склад = Регистр.ПартииТоваров.Склад;
|Товар = Регистр.ПартииТоваров.Товар;
|Партия = Регистр.ПартииТоваров.Партия;
|Остаток = Регистр.ПартииТоваров.Остаток;
|ПрихДок = Регистр.ПартииТоваров.Партия.ПрихДок;
|Стоимость = Регистр.ПартииТоваров.Стоимость;
|Функция ОстатокКонОст = КонОст(Остаток);
|Функция СтоимостьКонОст = КонОст(Стоимость);
|Группировка Партия упорядочить по Партия.ПрихДок, Партия.СерийныйНомер, Партия.ПартияОсн без групп;
|Группировка Склад упорядочить по Склад.Наименование без групп;
|Группировка Товар упорядочить по Товар.Наименование без групп;
|Условие(ПрихДок = Источник);
|Условие(Остаток > 0);
|"//}}ЗАПРОС
;
ОсновнойЗапрос = Запрос.Выполнить(ТекстЗапроса);
ВходящиеДанные = СоздатьОбъект("ТаблицаЗначений");
Запрос.Выгрузить(ВходящиеДанные,0,0);
ВходящиеДанные.ВыбратьСтроки;
Пока ВходящиеДанные.ПолучитьСтроку = 1 Цикл
Сообщить(Шаблон("[ВходящиеДанные.Товар] х [ВходящиеДанные.ОстатокКонОст] ед., [ВходящиеДанные.СтоимостьКонОст]р."));
КонецЦикла;
Если (ВходящиеДанные.КоличествоСтрок=0) Тогда
Отказ = 1;
КонецЕсли;
В этом коде переменная Источник — это документ поступления, по которому мы пытаемся найти остатки. Несмотря на то, что код выглядит корректно, он не возвращает ни одной строки. Выясним возможные причины.
Первое и самое важное правило при отладке запросов — убедитесь, что данные, которые вы ищете, действительно существуют в базе на момент выполнения запроса. Очень часто проблема кроется не в коде, а в состоянии учетной системы.
В нашем примере запрос ищет записи в регистре ПартииТоваров, где выполняются два ключевых условия:
Условие(ПрихДок = Источник) — партия должна быть сформирована конкретным документом поступления.Условие(Остаток > 0) — по этой партии должен быть положительный остаток.Как оказалось в разбираемом случае, причина была именно в данных. После документа поступления (Источник) был проведен документ расхода, который полностью списал товары из этой партии. В результате конечный остаток по регистру для этих партий стал равен нулю. Запрос отрабатывал абсолютно корректно — он просто не находил записей, удовлетворяющих условию Остаток > 0.
Как это проверить:
Источника.ПартииТоваров. Посмотрите, какие партии он сформировал.ПартииТоваров. Установите отбор по нужной партии (или по документу-регистратору, если это возможно) и посмотрите конечный остаток. Если он равен нулю, то ваш запрос ничего не найдет, и это правильное поведение системы.Вывод: всегда начинайте диагностику с проверки данных. Это может сэкономить часы отладки сложного кода.
Платформа 1С:Предприятие 7.7 имеет важную особенность при работе с "Конвертацией данных". В отличие от восьмой версии, где правила могут читаться и интерпретироваться "на лету", в "семерке" весь исполняемый код из обработчиков событий правил (таких как "Перед обработкой", "При выгрузке" и т.д.) встраивается в тело внешней обработки выгрузки (файл с расширением .ert).
Это означает, что после любого изменения кода в правилах конвертации необходимо заново формировать и сохранять обработку выгрузки. Если вы внесли правки в код, сохранили правила, но продолжили использовать старую версию .ert-файла, выгрузка будет работать по старой логике, и ваши изменения не возымеют эффекта.
Это частая ошибка, особенно для тех, кто привык к работе с 1С 8.x. Всегда помните об этом шаге:
.xml)..ert).Если вы убедились, что данные в базе есть и обработка выгрузки актуальна, но проблема осталась, следующим шагом будет полноценная отладка. Поскольку выгрузка выполняется внешней обработкой, ее можно легко отладить.
Порядок действий:
.ert).Запрос.Выполнить(ТекстЗапроса).Что нужно проверить в отладчике:
Источник. Убедитесь, что в эту переменную действительно передан нужный документ. Возможно, на предыдущих этапах произошла ошибка, и Источник имеет значение Неопределено или содержит ссылку на другой объект. Проверить это можно, добавив перед запросом отладочное сообщение: Сообщить("Источник: " + Источник + ", Тип: " + ТипЗначенияСтр(Источник));.ОсновнойЗапрос = Запрос.Выполнить(ТекстЗапроса) проверьте значение переменной ОсновнойЗапрос. Если оно равно 0, значит, в тексте запроса синтаксическая ошибка. Если 1 — синтаксически запрос верен.Запрос.Выгрузить(ВходящиеДанные,0,0) посмотрите значение ВходящиеДанные.КоличествоСтрок(). Если оно равно 0, значит, запрос выполнен успешно, но не нашел ни одной записи, удовлетворяющей условиям.Если отладчик не дал однозначного ответа, попробуйте метод "разделяй и властвуй". Временно упростите ваш запрос, чтобы понять, какое именно условие приводит к пустому результату.
|Условие(ПрихДок = Источник);. Если после этого данные появятся, значит, проблема точно связана либо с самой переменной Источник, либо с тем, что по этому документу действительно нет остатков.|Условие(Остаток > 0);. Если данные появятся, значит, по вашему документу-источнику есть движения, но конечный остаток нулевой или отрицательный.Такой пошаговый анализ поможет быстро локализовать проблемную часть запроса и сосредоточиться на ней.
В итоге, решая подобные задачи, важно придерживаться системного подхода: сначала исключить самые очевидные проблемы (данные и особенности платформы), а затем переходить к детальной отладке кода.