В процессе разработки механизмов проведения документов в 1С часто возникает задача не просто сообщить пользователю о нехватке товара на складе, а визуально указать, в какой именно строке табличной части возникла проблема — эту задачу решает инструмент автоматизации проверок и формирования сообщений. Стандартный вывод сообщений «в подвал» платформы не всегда удобен, особенно если в документе десятки или сотни строк. Рассмотрим, как реализовать механизм «адресного» вывода сообщений, чтобы пользователь сразу видел проблемную ячейку.
Объект СообщениеПользователю в платформе 1С:Предприятие 8.3 обладает уникальной способностью — он может «приклеиваться» к элементам формы. Для этого используются специальные свойства: Поле, ПутьКДанным и КлючДанных — их настройка упрощается через универсальный инструмент настройки контроля ввода данных без программирования. Когда мы заполняем эти свойства, платформа анализирует путь к данным и, если находит соответствующий элемент на открытой форме, отображает сообщение непосредственно под ним, помечая поле красным маркером.
Разберем подробнее, как работает адресация к табличной части. Путь к конкретной ячейке строится по следующему шаблону:
Объект.ИмяТабличнойЧасти[ИндексСтроки].ИмяРеквизита
Важно помнить, что в коде 1С номер строки (НомерСтроки) начинается с 1, а индекс в коллекции (массиве) начинается с 0. Поэтому при формировании пути мы всегда вычитаем единицу из номера строки.
Чаще всего проверка остатков происходит в модуле объекта в процедуре ОбработкаПроведения. На этом этапе у нас уже есть данные о нехватке (обычно полученные запросом к регистру накопления). Проанализируем ситуацию, когда нам нужно вывести сообщения для всех строк, где обнаружен дефицит — для этого подойдёт автоматическое исправление ошибок нехватки запасов.
Рассмотрим пример кода, который можно интегрировать в цикл обхода результатов запроса с остатками:
// Предположим, Выборка - это результат запроса по остаткам
Пока Выборка.Следующий() Цикл
Если Выборка.КоличествоОстаток < 0 Тогда
// Устанавливаем Отказ, чтобы документ не провелся
Отказ = Истина;
// Формируем текст сообщения
ТекстСообщения = СтрШаблон("Недостаточно товара '%1'. Требуется еще %2 ед.",
Выборка.Номенклатура,
-Выборка.КоличествоОстаток);
// Создаем объект сообщения
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = ТекстСообщения;
// Самый важный момент: привязка к строке ТЧ.
// Допустим, мы заранее нашли НомерСтроки из ТЧ документа, который соответствует этой номенклатуре.
ИндексСтроки = Выборка.НомерСтроки - 1;
// Формируем путь к полю "Количество" в нужной строке
Сообщение.Поле = СтрШаблон("Объект.Товары[%1].Количество", Формат(ИндексСтроки, "ЧГ=0"));
// Указываем путь к данным (обычно "Объект", если проверка в модуле объекта)
Сообщение.ПутьКДанным = "Объект";
// Выводим сообщение
Сообщение.Сообщить();
КонецЕсли;
КонецЦикла;
Одной из главных трудностей является определение индекса строки. Запрос по остаткам обычно группирует данные по номенклатуре, в то время как в документе одна и та же номенклатура может встречаться в разных строках. Чтобы сообщение попало точно в цель, рекомендуется использовать метод НайтиСтроки().
Рассмотрим по шагам, как это сделать правильно:
СтруктураПоиска = Новый Структура("Номенклатура", Выборка.Номенклатура);
НайденныеСтроки = ЭтотОбъект.Товары.НайтиСтроки(СтруктураПоиска);
Для Каждого СтрокаТЧ Из НайденныеСтроки Цикл
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "В этой строке указано количество, превышающее остаток!";
Сообщение.Поле = "Объект.Товары[" + (СтрокаТЧ.НомерСтроки - 1) + "].Количество";
Сообщение.Сообщить();
КонецЦикла;
Если ваша конфигурация построена на базе Библиотеки стандартных подсистем (БСП), задачу можно решить еще изящнее. В общем модуле ОбщегоНазначенияКлиентСервер существует готовая процедура СообщитьПользователю, которая инкапсулирует в себе создание объекта и заполнение его свойств.
Пример использования функции БСП:
ИмяПоля = СтрШаблон("Объект.Товары[%1].Номенклатура", Формат(НомерСтроки - 1, "ЧГ=0"));
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(
"Чего-то не хватает",
,
ИмяПоля,
"Объект"
);
Этот метод хорош тем, что он автоматически обрабатывает нюансы платформы и делает код более читаемым — подобный системный подход реализует инструмент централизованного управления логикой проверки реквизитов.
Проанализируем несколько критических моментов, которые часто упускают разработчики:
ПередЗаписью на форме, если вы собираетесь проводить документ. Проверка остатков должна быть «внутри» транзакции проведения, чтобы данные не изменились в промежутке между проверкой и записью движений. Сообщения, созданные в ОбработкаПроведения, прекрасно доходят до пользователя, даже если установлен Отказ = Истина."ЧГ=0" при преобразовании индекса в строку. Если индекс будет равен 1000, стандартное преобразование может вставить неразрывный пробел (1 000), и платформа не сможет распознать путь к данным.КлючСтроки (УникальныйИдентификатор) для точной адресации.Если строк с ошибками слишком много, экран пользователя может быть буквально завален всплывающими окнами сообщений. В этом случае полезно комбинировать СообщениеПользователю с механизмом Условного оформления. Программно добавляя правила оформления для формы, мы можем подсветить все дефицитные строки красным фоном. Это даст пользователю общую картину проблемы, а конкретные сообщения (при клике на строку) помогут понять детали нехватки.
Таким образом, использование свойства Поле объекта СообщениеПользователю является стандартом качественной разработки в 1С. Это значительно повышает юзабилити системы и снижает количество вопросов от пользователей при работе с документами отгрузки и списания — также пользователь может видеть дефицит заранее через решение для вывода остатков товаров в строках документов продажи.