В работе с устаревшими, но все еще актуальными конфигурациями на платформе 1С:Предприятие 7.7 часто возникает задача ускорения ручного ввода данных. Представьте ситуацию: вам необходимо восстановить десятки актов, в каждом из которых сотни строк номенклатуры. Выбирать каждый элемент через стандартное дерево справочника — процесс крайне трудоемкий. В этой статье мы подробно разберем, как реализовать автоматический поиск и подстановку данных (артикула и цены) в табличную часть (ТЧ) документа при вводе названия материала.
Этот способ позволяет реализовать следующую логику: пользователь вводит текст в колонку "Материал", нажимает Enter, и система сама находит соответствующий элемент в справочнике, заполняя остальные реквизиты строки. Рассмотрим этот процесс по шагам.
Во-первых, нам необходимо зайти в Конфигуратор, открыть форму нужного документа и найти свойства колонки "Материал" в табличной части. На закладке "Дополнительно" в поле "Формула" следует прописать название процедуры, которая будет срабатывать при изменении значения в ячейке. Назовем её ПриИзмененииМатериала().
Теперь перейдем в модуль формы документа и проанализируем код, который нам понадобится написать. Разберем пример реализации:
Процедура ПриИзмененииМатериала()
// Создаем объект справочника для поиска
Спр = СоздатьОбъект("Справочник.Номенклатура");
// Получаем введенное пользователем значение из текущей строки
ТекНазвание = Материал;
// Пытаемся найти элемент по полному или частичному совпадению
// Параметры: НайтиПоНаименованию(СтрокаПоиска, РежимПоиска, РежимСоответствия)
// 0 - поиск во всем справочнике, 1 - поиск по начальной части строки
Если Спр.НайтиПоНаименованию(ТекНазвание, 0, 1) = 1 Тогда
// Если элемент найден, присваиваем ссылочное значение в ТЧ
Материал = Спр.ТекущийЭлемент();
// Автоматически заполняем Артикул и Цену
Артикул = Спр.Артикул;
// Важный момент: если цена периодическая, используем метод Получить()
Цена = Спр.Цена.Получить(ДатаДок);
// Пересчитываем сумму строки, если это необходимо
Сумма = Количество * Цена;
Иначе
Предупреждение("Материал с таким названием не найден!");
КонецЕсли;
КонецПроцедуры
Разберем, почему мы использовали метод Получить(ДатаДок) для цены. В 1С 7.7 цены часто хранятся как периодические реквизиты. Это означает, что значение цены меняется во времени. Если мы просто обратимся к Спр.Цена, система может вернуть пустое значение или актуальное на текущий момент, в то время как нам нужна цена, действовавшая на дату оформления документа.
Если в справочнике много похожих названий (например, "Грымзалка сепульная" и "Грымзалка вонявая"), автоматический поиск из первого метода может выбрать не тот элемент. В этом случае эффективнее использовать механизм Подбора.
Проанализируем, как настроить подбор так, чтобы он работал максимально быстро. Мы можем вызвать форму выбора справочника программно при нажатии кнопки или по горячей клавише. В 1С 7.7 для этого используется команда ОткрытьПодбор.
Процедура СделатьПодбор()
// Открываем справочник в режиме подбора
// "ДляВыбора" - это название формы списка в конфигураторе
ОткрытьПодбор("Справочник.Номенклатура", "ФормаСписка", Контекст, 0);
КонецПроцедуры
Процедура ОбработкаПодбора(Элемент)
// Данная процедура срабатывает, когда пользователь выбирает товар в справочнике
НоваяСтрока();
Материал = Элемент;
Артикул = Элемент.Артикул;
Цена = Элемент.Цена.Получить(ДатаДок);
КонецПроцедуры
Преимущество подбора заключается в том, что справочник не закрывается после выбора одной позиции. Вы можете просто дважды щелкать по нужным строкам в списке товаров, и они будут мгновенно добавляться в ваш акт. Это значительно ускоряет работу, если у вас перед глазами бумажный перечень.
Рассмотрим ситуацию, когда вам не нужно хранить артикул непосредственно в табличной части документа, а достаточно лишь отображать его для печати или проверки. В 1С 7.7 есть элегантное решение — текстовые колонки.
Выясним, как это работает. Вместо того чтобы создавать в структуре документа реальный реквизит "Артикул", мы создаем в табличной части на форме "Текст" (на панели инструментов редактора форм). В свойствах этого текста на закладке "Дополнительно" в поле "Выражение" пишем:
Материал.Артикул
В этом случае система будет динамически "вытягивать" артикул из карточки товара прямо в момент отрисовки формы. Это экономит место в базе данных и гарантирует, что вы всегда видите актуальный артикул, привязанный к конкретной номенклатуре.
Если перед вами стоит задача восстановить 60 объектов с тысячами строк, даже самый быстрый ручной ввод может затянуться на недели. Посмотрим на проблему шире: если акты есть в бумажном виде, их можно отсканировать.
Проанализируем алгоритм действий для такой ситуации:
При импорте данных крайне важно осуществлять поиск товара не по наименованию (которое при распознавании может содержать ошибки типа "гримзалка" вместо "грымзалка"), а по артикулу или коду. Код — это числовой идентификатор, который система распознает гораздо точнее.
Пример логики загрузки из внешнего файла:
// Фрагмент кода загрузки
Excel = СоздатьОбъект("Excel.Application");
// ... открытие файла и цикл по строкам ...
КодТовара = СокрЛП(Excel.Cells(Строка, 1).Value);
Если Спр.НайтиПоКоду(КодТовара) = 1 Тогда
НоваяСтрока();
Материал = Спр.ТекущийЭлемент();
Количество = Число(Excel.Cells(Строка, 3).Value);
// И так далее...
КонецЕсли;
Мы рассмотрели несколько подходов к решению задачи автоматизации в 1С 7.7. Выбор конкретного метода зависит от точности ваших данных и объема работы:
НайтиПоНаименованию.Важный совет: всегда делайте архивную копию базы данных перед внесением изменений в конфигурацию или массовой загрузкой данных. В 1С 7.7 это делается простым копированием папки с базой (файлы .dbf и .md).