При разработке отчетов в 1С:Управление торговлей 11 (УТ 11) программисты часто сталкиваются с двумя задачами: необходимостью вывести контактную информацию (КИ) контрагентов в отдельные колонки и потребностью реализовать сложную логику расчетов в системе компоновки данных (СКД). Ситуация осложняется тем, что в современных конфигурациях на базе БСП контактная информация хранится в табличных частях, а не в линейных реквизитах справочника.
В этой статье мы подробно разберем, как правильно составить запрос для получения ФИО, почты и телефона, как связать эти данные с реализациями товаров и как решить проблему с использованием вычисляемых полей в группировках СКД.
Первым делом нам необходимо отобрать тех контрагентов, у которых были продажи конкретной номенклатуры. Для этого проанализируем структуру данных УТ 11. Вместо прямого обращения к документам РеализацияТоваровУслуг, что является ресурсоемкой операцией, мы рекомендуем использовать регистр накопления ВыручкаИСебестоимостьПродаж. Это обеспечит высокую скорость работы отчета.
Рассмотрим структуру запроса. Нам нужно объединить данные о продажах и данные из справочника Контрагенты (или Партнеры), а затем присоединить к ним контактную информацию.
Разберем по шагам, как вытащить КИ (телефон, email, адрес) в отдельные колонки, используя метод левых соединений. Для этого в каждом соединении мы будем накладывать фильтр на конкретный вид контактной информации.
ВЫБРАТЬ
Продажи.Контрагент КАК Контрагент,
Продажи.Контрагент.Наименование КАК ФИО,
КИ_Телефон.Представление КАК Телефон,
КИ_Почта.Представление КАК ЭлектроннаяПочта,
КИ_Адрес.Представление КАК Регион
ИЗ
(ВЫБРАТЬ РАЗЛИЧНЫЕ
Обороты.Контрагент КАК Контрагент
ИЗ
РегистрНакопления.ВыручкаИСебестоимостьПродаж КАК Обороты
ГДЕ
Обороты.АналитикаУчетаНоменклатуры.Номенклатура = &НужнаяНоменклатура) КАК Продажи
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Контрагенты.КонтактнаяИнформация КАК КИ_Телефон
ПО Продажи.Контрагент = КИ_Телефон.Ссылка
И КИ_Телефон.Тип = ЗНАЧЕНИЕ(Перечисление.ТипыКонтактнойИнформации.Телефон)
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Контрагенты.КонтактнаяИнформация КАК КИ_Почта
ПО Продажи.Контрагент = КИ_Почта.Ссылка
И КИ_Почта.Тип = ЗНАЧЕНИЕ(Перечисление.ТипыКонтактнойИнформации.АдресЭлектроннойПочты)
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Контрагенты.КонтактнаяИнформация КАК КИ_Адрес
ПО Продажи.Контрагент = КИ_Адрес.Ссылка
И КИ_Адрес.Тип = ЗНАЧЕНИЕ(Перечисление.ТипыКонтактнойИнформации.Адрес)
Важный нюанс: В УТ 11 для получения именно региона из адреса может потребоваться разбор поля ЗначенияПолей, где данные хранятся в формате XML/JSON. Если стандартного Представления недостаточно, рассмотрим альтернативный вариант: использование программного интерфейса БСП (общий модуль УправлениеКонтактнойИнформации), однако в чистом запросе это реализовать сложнее.
Часто возникает ситуация, когда в отчете нужно рассчитать премию или отклонение по формуле: Если Сумма >= План Тогда Сумма * 5% Иначе Сумма * 3%. При попытке добавить такое выражение в "Вычисляемые поля" пользователи часто получают ошибку: "Поле не может быть использовано в группировке". Выясним причину.
Эта ошибка возникает из-за того, что СКД не понимает, как агрегировать (складывать) результаты условий на уровне итогов. Для решения этой проблемы мы должны перенести расчет из вкладки "Вычисляемые поля" на вкладку "Ресурсы".
Проанализируем правильный синтаксис выражения для ресурса. Мы должны обернуть каждое слагаемое в агрегатную функцию Сумма(), чтобы система могла корректно рассчитать данные для каждого квартала, года или контрагента.
Посмотрим на пример правильного выражения в колонке "Выражение" на закладке "Ресурсы":
ВЫБОР
КОГДА Сумма(ОборотОтгружен) >= Сумма(План)
ТОГДА Сумма(ОборотОтгружен) * 0.05
ИНАЧЕ Сумма(ОборотОтгружен) * 0.03
КОНЕЦ
Рассмотрим, почему это работает:
Сумма(ОборотОтгружен) вычисляется для конкретной строки группировки (например, за Квартал).ОборотОтгружен и План за этот период, срабатывает условие ВЫБОР.Если ваша задача требует получения данных из других строк или расчета накопительных итогов (например, сравнение продаж текущего квартала с планом всего года), необходимо использовать функцию ВычислитьВыражение. Проанализируем типичную ошибку в синтаксисе этой функции.
Посмотрим на пример некорректного вызова: ВычислитьВыражение("Сумма(СуммаВыручки)", "Квартал", , "Первая"). Лишние запятые или пропущенные параметры приводят к отказу системы. Правильный синтаксис требует четкого указания области вычисления.
Для обращения к конкретному вычисляемому полю по имени в ресурсах, мы просто пишем его имя, но только если оно само уже определено как ресурс. Если же мы хотим использовать логику "если-то" на уровне общих итогов, лучше всего использовать конструкцию ВЫБОР непосредственно в описании ресурса, как было показано выше.
Подводя итог нашему разбору, выделим основные правила работы с запросами и СКД в 1С:
КонтактнаяИнформация с обязательным фильтром по Тип или Вид, чтобы избежать дублирования строк.ФамилияИмяОтчествоФизЛиц.Соблюдение этих структурных подходов позволит вам создавать быстрые и надежные отчеты, которые корректно работают с большими объемами данных в конфигурации 1С:Управление торговлей.