Почему запрос в правилах конвертации данных 1С 7.7 не возвращает данные?

Программист 1С v7.7 Управленческий учет Торговля и дистрибуция
← На главную

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

Проанализируем ситуацию на примере реального кода и разберем по шагам, как диагностировать и решить подобную проблему.

Исходная проблема: запрос не возвращает строк

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


Запрос = СоздатьОбъект("Запрос");
ТекстЗапроса = 
"//{{ЗАПРОС
|Склад = Регистр.ПартииТоваров.Склад;
|Товар = Регистр.ПартииТоваров.Товар;
|Партия = Регистр.ПартииТоваров.Партия;
|Остаток = Регистр.ПартииТоваров.Остаток;
|ПрихДок = Регистр.ПартииТоваров.Партия.ПрихДок;
|Стоимость = Регистр.ПартииТоваров.Стоимость;
|Функция ОстатокКонОст = КонОст(Остаток);
|Функция СтоимостьКонОст = КонОст(Стоимость);
|Группировка Партия упорядочить по Партия.ПрихДок, Партия.СерийныйНомер, Партия.ПартияОсн без групп;
|Группировка Склад упорядочить по Склад.Наименование без групп;
|Группировка Товар упорядочить по Товар.Наименование без групп;
|Условие(ПрихДок = Источник);
|Условие(Остаток > 0);
|"//}}ЗАПРОС
;

ОсновнойЗапрос = Запрос.Выполнить(ТекстЗапроса);
ВходящиеДанные = СоздатьОбъект("ТаблицаЗначений");
Запрос.Выгрузить(ВходящиеДанные,0,0);

ВходящиеДанные.ВыбратьСтроки;
Пока ВходящиеДанные.ПолучитьСтроку = 1 Цикл
    Сообщить(Шаблон("[ВходящиеДанные.Товар] х [ВходящиеДанные.ОстатокКонОст] ед., [ВходящиеДанные.СтоимостьКонОст]р."));
КонецЦикла;

Если (ВходящиеДанные.КоличествоСтрок=0) Тогда
    Отказ = 1;
КонецЕсли;

В этом коде переменная Источник — это документ поступления, по которому мы пытаемся найти остатки. Несмотря на то, что код выглядит корректно, он не возвращает ни одной строки. Выясним возможные причины.

Шаг 1. Проверка исходных данных — самая частая причина

Первое и самое важное правило при отладке запросов — убедитесь, что данные, которые вы ищете, действительно существуют в базе на момент выполнения запроса. Очень часто проблема кроется не в коде, а в состоянии учетной системы.

В нашем примере запрос ищет записи в регистре ПартииТоваров, где выполняются два ключевых условия:

  1. Условие(ПрихДок = Источник) — партия должна быть сформирована конкретным документом поступления.
  2. Условие(Остаток > 0) — по этой партии должен быть положительный остаток.

Как оказалось в разбираемом случае, причина была именно в данных. После документа поступления (Источник) был проведен документ расхода, который полностью списал товары из этой партии. В результате конечный остаток по регистру для этих партий стал равен нулю. Запрос отрабатывал абсолютно корректно — он просто не находил записей, удовлетворяющих условию Остаток > 0.

Как это проверить:

  1. Откройте журнал документов и найдите конкретный документ, который вы используете в качестве Источника.
  2. Откройте движения этого документа по регистру ПартииТоваров. Посмотрите, какие партии он сформировал.
  3. Откройте отчет по остаткам или непосредственно сам регистр ПартииТоваров. Установите отбор по нужной партии (или по документу-регистратору, если это возможно) и посмотрите конечный остаток. Если он равен нулю, то ваш запрос ничего не найдет, и это правильное поведение системы.

Вывод: всегда начинайте диагностику с проверки данных. Это может сэкономить часы отладки сложного кода.

Шаг 2. Техническая особенность 1С 7.7 — обновление обработки выгрузки

Платформа 1С:Предприятие 7.7 имеет важную особенность при работе с "Конвертацией данных". В отличие от восьмой версии, где правила могут читаться и интерпретироваться "на лету", в "семерке" весь исполняемый код из обработчиков событий правил (таких как "Перед обработкой", "При выгрузке" и т.д.) встраивается в тело внешней обработки выгрузки (файл с расширением .ert).

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

Это частая ошибка, особенно для тех, кто привык к работе с 1С 8.x. Всегда помните об этом шаге:

  1. Открыли правила в "Конвертации данных".
  2. Внесли изменения в код обработчика.
  3. Сохранили правила (.xml).
  4. Сформировали и сохранили новую обработку выгрузки (.ert).
  5. Именно этот новый файл используйте для выгрузки данных.

Шаг 3. Использование отладчика и пошаговый анализ

Если вы убедились, что данные в базе есть и обработка выгрузки актуальна, но проблема осталась, следующим шагом будет полноценная отладка. Поскольку выгрузка выполняется внешней обработкой, ее можно легко отладить.

Порядок действий:

  1. Откройте конфигуратор вашей базы-источника.
  2. Через меню "Файл" -> "Открыть" выберите ваш сохраненный файл обработки выгрузки (.ert).
  3. Найдите в коде обработки место, где выполняется ваш запрос. Обычно это будет процедура или функция, соответствующая вашему обработчику в правилах.
  4. Установите точку останова перед строкой Запрос.Выполнить(ТекстЗапроса).
  5. Запустите 1С в режиме отладки ("Предприятие").
  6. Откройте вашу обработку выгрузки и запустите ее.
  7. Когда выполнение дойдет до точки останова, вы сможете проанализировать значения переменных с помощью табло (Shift+F9).

Что нужно проверить в отладчике:

Шаг 4. Упрощение запроса для локализации проблемы

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

  1. Закомментируйте условие по источнику. Удалите или закомментируйте строку |Условие(ПрихДок = Источник);. Если после этого данные появятся, значит, проблема точно связана либо с самой переменной Источник, либо с тем, что по этому документу действительно нет остатков.
  2. Закомментируйте условие по остатку. Удалите строку |Условие(Остаток > 0);. Если данные появятся, значит, по вашему документу-источнику есть движения, но конечный остаток нулевой или отрицательный.

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

В итоге, решая подобные задачи, важно придерживаться системного подхода: сначала исключить самые очевидные проблемы (данные и особенности платформы), а затем переходить к детальной отладке кода.

← На главную