При разработке отчетов и обработок в 1С часто возникает задача вывода в одну колонку данных разных типов, например, номера и даты документа. В языке запросов 1С существует ограничение: оператор сложения + работает только с полями строкового типа. Если вы попытаетесь сложить строку с датой или числом напрямую, платформа выдаст ошибку. Давайте разберем, как правильно решить эту задачу.
Существует способ объединения данных непосредственно в тексте запроса. Он основан на разбиении даты на составляющие (день, месяц, год) с помощью функций ДЕНЬ(), МЕСЯЦ(), ГОД(), преобразовании их в строки через математические операции и последующем склеивании. Однако этот метод крайне сложен в поддержке и написании.
Рассмотрим пример того, как это выглядит в запросе:
ВЫБРАТЬ
"№" + Поступление.НомерВходящегоДокумента + " от " +
ПОДСТРОКА("0123456789", ДЕНЬ(Поступление.ДатаВходящегоДокумента) / 10 + 1, 1) +
ПОДСТРОКА("0123456789", СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, 6 * ДЕНЬ(Поступление.ДатаВходящегоДокумента))) / 6 + 1, 1) + "/" + ...
КАК Основание
ИЗ
Документ.ПоступлениеТоваровУслуг КАК Поступление
Важно: Данный метод является «извращенным» и рекомендуется к использованию только в крайних случаях, когда нет возможности изменить код обработки данных в модуле.
Самый эффективный, быстрый и читаемый способ — это получение исходных данных (номера и даты) в отдельные колонки в запросе, а затем их объединение средствами языка программирования 1С. Это избавляет от необходимости «городить огород» из сложных функций в запросе.
Давайте разберем этот процесс по шагам:
РезультатЗапроса.Выбрать() или Выгрузить().Формат().Пример реализации в коде модуля:
// В тексте запроса просто выбираем поля без преобразований
Запрос.Текст = "ВЫБРАТЬ
| Т.Сделка,
| Т.НомерВходящегоДокумента,
| Т.ДатаВходящегоДокумента
|ИЗ ВТ_Таблица КАК Т";
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
ТекСтрока = Объект.Проекты.Добавить();
ЗаполнитьЗначенияСвойств(ТекСтрока, Выборка);
// Формируем описание программно
Если ЗначениеЗаполнено(Выборка.НомерВходящегоДокумента) И ЗначениеЗаполнено(Выборка.ДатаВходящегоДокумента) Тогда
ТекСтрока.Описание = "№" + Формат(Выборка.НомерВходящегоДокумента, "ЧГ=0")
+ " от " + Формат(Выборка.ДатаВходящегоДокумента, "ДЛФ=D");
КонецЕсли;
КонецЦикла;
Рассмотрим преимущества данного метода:
ПОДСТРОКА и ДОБАВИТЬКДАТЕ.Формат() вы можете легко менять вид даты (например, ДЛФ=D для краткого формата или ДФ=dd.MM.yyyy для произвольного).НомерВходящегоДокумента и ДатаВходящегоДокумента в отладчике, чтобы убедиться, что они не пустые.Если данные в запросе не отображаются, первым делом проверьте, не являются ли исходные поля НомерВходящегоДокумента и ДатаВходящегоДокумента пустыми значениями. Всегда полезно вывести их в отдельные колонки для предварительного контроля перед объединением в итоговую строку.
Если вы используете СКД, то подобную задачу можно решить через Вычисляемые поля, где выражение будет выглядеть гораздо проще, чем в классическом запросе, благодаря встроенным функциям преобразования типов 1С.