При формировании регламентированной формы КО-3 («Журнал регистрации приходных и расходных кассовых документов») в конфигурации «1С:Бухгалтерия предприятия 2.0» часто возникает задача изменить стандартное заполнение графы примечания. По умолчанию типовой отчет выводит в эту колонку информацию о валюте операции, если она отличается от валюты регламентированного учета. Пользователям же нередко требуется видеть контрагента или физическое лицо, от которого поступили денежные средства, то есть значение реквизита ПринятоОт документа «Приходный кассовый ордер».
Однако при попытке напрямую добавить данное поле в существующий запрос разработчики сталкиваются с системной ошибкой платформы: «В запросе, содержащем предложение СГРУППИРОВАТЬ ПО, в списке выборки не могут участвовать поля неограниченной длины». Разберем по шагам, почему возникает эта ошибка и как правильно доработать запрос и вывод данных в макет.
Проанализируем структуру хранения данных в платформе 1С:Предприятие. Реквизит ПринятоОт в документе «Приходный кассовый ордер» имеет строковый тип данных с неограниченной длиной. В реляционных СУБД (Microsoft SQL Server, PostgreSQL и др.) строки неограниченной длины хранятся в специальных типах данных большого объема (LOB/BLOB). Для таких структур на уровне базы данных запрещены операции прямого сравнения, сортировки и группировки.
Поскольку типовой запрос журнала КО-3 использует предложение СГРУППИРОВАТЬ ПО, прямое добавление поля Док.ПринятоОт КАК ПринятоОт в секцию ВЫБРАТЬ приводит к исключительной ситуации. Платформа не может сгруппировать записи по полю неограниченной длины без явного указания его точного размера.
Разберем классическое решение проблемы. Чтобы платформа смогла корректно обработать строку в группировке, необходимо ограничить ее длину с помощью оператора языка запросов ВЫРАЗИТЬ. Обратите внимание: максимальная длина строки, которую можно задать в конструкции ВЫРАЗИТЬ(... КАК Строка(N)), составляет 1024 символа. Для наименования источника платежа обычно достаточно длины в 150–250 символов.
Выполним доработку типового запроса формирования выборки по ПКО по следующим шагам:
ЖурналРегистрацииКассовыхДокументов) или создадим на ее базе внешнюю обработку.ЗапросПоДокументамПКО.ВЫБРАТЬ.СГРУППИРОВАТЬ ПО.Посмотрим на пример скорректированного запроса:
// Выборка ПКО
ЗапросПоДокументамПКО = Новый Запрос;
ЗапросПоДокументамПКО.Текст =
"ВЫБРАТЬ
| Док.Ссылка КАК Документ,
| НАЧАЛОПЕРИОДА(Док.Дата, ДЕНЬ) КАК День,
| Док.Номер,
| Док.Дата КАК Дата,
| ВЫРАЗИТЬ(Док.ПринятоОт КАК Строка(150)) КАК ПринятоОт,
| ПРЕДСТАВЛЕНИЕ(Док.ВалютаДокумента) КАК ВалютаДокумента,
| СУММА(ВЫБОР
| КОГДА Док.ВалютаДокумента <> &мВалютаРегламентированногоУчета
| ТОГДА Док.СуммаДокумента
| ИНАЧЕ 0
| КОНЕЦ) КАК ПриходВал,
| СУММА(ВЫБОР
| КОГДА Док.ВалютаДокумента <> &мВалютаРегламентированногоУчета
| ТОГДА Док.СуммаДокумента * КурсыВалют.Курс / КурсыВалют.Кратность
| ИНАЧЕ Док.СуммаДокумента
| КОНЕЦ) КАК Приход,
| КурсыВалют.Курс,
| КурсыВалют.Кратность
|ИЗ
| Документ.ПриходныйКассовыйОрдер КАК Док
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют КАК КурсыВалют
| ПО Док.ВалютаДокумента = КурсыВалют.Валюта
| И (КурсыВалют.Период В
| (ВЫБРАТЬ
| МАКСИМУМ(КурсыВалют.Период) КАК Период
| ИЗ
| РегистрСведений.КурсыВалют КАК КурсыВалют
| ГДЕ
| КурсыВалют.Период <= Док.Дата
| И Док.ВалютаДокумента = КурсыВалют.Валюта))
|ГДЕ
| Док.ПометкаУдаления = ЛОЖЬ
| И Док.Дата МЕЖДУ &НачИтоги И &ДатаКон
| И Док.Организация = &Организация
|
|СГРУППИРОВАТЬ ПО
| НАЧАЛОПЕРИОДА(Док.Дата, ДЕНЬ),
| Док.Ссылка,
| Док.Номер,
| Док.Дата,
| ВЫРАЗИТЬ(Док.ПринятоОт КАК Строка(150)),
| КурсыВалют.Курс,
| КурсыВалют.Кратность,
| ПРЕДСТАВЛЕНИЕ(Док.ВалютаДокумента)
|
|УПОРЯДОЧИТЬ ПО
| День,
| Документ
|ИТОГИ ПО
| День,
| Документ
|АВТОУПОРЯДОЧИВАНИЕ";
Рассмотрим альтернативный и более чистый вариант написания запроса. Если мы не хотим перегружать секцию СГРУППИРОВАТЬ ПО дополнительными полями, поле с ограниченной длиной можно обернуть в агрегатную функцию МАКСИМУМ. Поскольку группировка уже идет по уникальной ссылке документа (Док.Ссылка), агрегатная функция гарантированно вернет точное значение реквизита конкретного документа без риска искажения данных.
Посмотрим, как изменится описание поля в секции ВЫБРАТЬ:
МАКСИМУМ(ВЫРАЗИТЬ(Док.ПринятоОт КАК Строка(250))) КАК ПринятоОт,
В этом случае в блоке СГРУППИРОВАТЬ ПО поле указывать не потребуется, что упрощает сопровождение текста запроса и снижает вероятность синтаксических ошибок.
После того как данные успешно выбраны запросом, найдем в коде процедуру вывода строк в табличный документ. В типовом коде текст примечания формируется через тернарный оператор в переменную ТекстПримечания:
ТекстПримечания = ?(ВыборкаПоДокументамПКО.ВалютаДокумента = НаименованиеВалютыРегламентированногоУчета, "", "В валюте (" + ВыборкаПоДокументамПКО.ВалютаДокумента +")");
Заменим эту строку на прямое присвоение выбранного значения или объединим их при необходимости:
// Полная замена примечания на значение реквизита "Принято от"
ТекстПримечания = ВыборкаПоДокументамПКО.ПринятоОт;
Далее значение переменной ТекстПримечания передается в параметры области макета перед выводом в табличный документ:
ОбластьСтрока.Параметры.Примечание = ТекстПримечания;
ТабДокумент.Вывести(ОбластьСтрока);
Форма КО-3 представляет собой двухстороннюю ведомость, где слева регистрируются приходные документы (ПКО), а справа — расходные (РКО). Чтобы отчет выглядел целостно и единообразно, рекомендуется внести аналогичные правки во второй запрос обработки, отвечающий за выборку расходных кассовых ордеров.
В документе «Расходный кассовый ордер» реквизит с информацией о получателе называется Выдать. В тексте запроса по РКО добавляем аналогичную конструкцию:
МАКСИМУМ(ВЫРАЗИТЬ(ДокРКО.Выдать КАК Строка(250))) КАК Выдать,
А в цикле вывода данных по РКО подставляем полученное значение:
ТекстПримечанияРКО = ВыборкаПоДокументамРКО.Выдать;
Текстовая строка с ФИО или наименованием организации в графе «Принято от» нередко превышает по ширине стандартную колонку «Примечание». Чтобы данные не обрезались при печати, проверим настройки ячейки в макете печатной формы:
Переносить.Такой подход гарантирует корректный перенос длинных строк и сохранение читаемости печатной формы журнала кассовых документов.