Как реализовать ввод товара по коду или артикулу в табличной части документа 1С 7.7

Программист 1С v7.7 IT и автоматизация бизнеса
← На главную

Разработка интерфейсных решений на платформе 1С:Предприятие 7.7 часто сопряжена с определенными ограничениями. Одной из классических задач является организация удобного ввода данных в табличную часть документа. Стандартное поведение системы предполагает выбор элемента из справочника через диалоговое окно, однако для операторов склада или розничных точек гораздо удобнее вводить код товара, артикул или штрихкод напрямую в строку и сразу получать найденную номенклатуру.

Проанализируем ситуацию: основной проблемой является то, что обычная колонка типа "Текст" в табличной части 1С 7.7 не является полем ввода. Она предназначена лишь для отображения вычисляемых данных. Рассмотрим подробнее доступные методы решения этой задачи, от стандартных средств до использования внешних компонент.

Метод 1: Использование служебного реквизита в табличной части

Это самый простой и надежный способ, не требующий сторонних библиотек. Несмотря на то, что авторы обсуждений иногда стремятся избежать "лишних" реквизитов в структуре метаданных, этот подход обеспечивает максимальную стабильность.

Разберем по шагам реализацию этого метода:

  1. Добавим в табличную часть документа реквизит ВводКода с типом "Строка".
  2. Разместим этот реквизит на форме документа в колонке табличной части.
  3. В свойствах колонки на форме, на закладке "Дополнительно", в поле "Формула" укажем вызов процедуры, например: ПриИзмененииКода().

Теперь проанализируем пример кода, который будет обрабатывать ввод:


Процедура ПриИзмененииКода()
    // Получаем текущее значение введенного кода
    ВведКод = СокрЛП(ВводКода);
    
    Если ПустаяСтрока(ВведКод) = 1 Тогда
        Возврат;
    КонецЕсли;

    // Пытаемся найти товар по коду
    СпрНоменклатура = СоздатьОбъект("Справочник.Номенклатура");
    Если СпрНоменклатура.НайтиПоКоду(ВведКод, 0) = 1 Тогда
        Товар = СпрНоменклатура.ТекущийЭлемент();
        // После успешного поиска очищаем поле ввода для удобства следующего ввода
        ВводКода = ""; 
    Иначе
        Предупреждение("Товар с таким кодом не найден!", 2);
    КонецЕсли;
КонецПроцедуры

Важный момент: если мы хотим искать не только по коду, но и по артикулу или штрихкоду, мы можем добавить логику перебора. Программа сначала проверит совпадение по одному полю, затем по другому, обеспечивая универсальность ввода.

Метод 2: Использование внешнего поля ввода на форме

Если мы принципиально не хотим загромождать табличную часть новыми колонками, рассмотрим вариант с выносным полем ввода. Посмотрим на этот алгоритм: пользователь перемещается по табличной части, а фокус для ввода данных переводит в отдельное текстовое поле, расположенное над таблицей или под ней.

В этом случае последовательность действий будет следующей:

  1. Разместим на форме документа текстовое поле (не реквизит документа, а просто элемент формы) с идентификатором ПолеБыстрогоВвода.
  2. В формуле этого поля пропишем процедуру поиска.
  3. При вводе значения программа определит текущую строку табличной части через метод НомерСтроки и подставит туда найденный товар.

Этот способ часто критикуют за необходимость переключать фокус (нажимать мышкой или Tab), однако он позволяет оставить структуру документа "чистой".

Метод 3: Применение внешней компоненты FormEx

Для продвинутых разработчиков 1С 7.7 наиболее элегантным решением является использование внешней компоненты FormEx. Она позволяет расширить событийную модель формы и перехватывать нажатия клавиш клавиатуры еще до того, как они будут обработаны стандартными механизмами платформы.

Разберем, как это работает. С помощью FormEx мы можем отловить событие ПриНажатииКнопкиКлавиатуры. Если фокус находится в определенной колонке табличной части, мы можем программно вызвать окно ввода значения или начать накапливать вводимые символы в буфер.

Основные преимущества использования FormEx:

Метод 4: Табличное поле из состава 1С++

Еще один профессиональный путь — полная замена стандартной таблицы документа на объект "Табличное поле" (Grid) из состава компоненты 1С++. Это превращает работу с таблицей в подобие того, как это реализовано в современных версиях 1С 8.x.

Проанализируем возможности этого метода:

Рассмотрим пример логики при использовании табличного поля:


// Пример перехвата события после завершения редактирования ячейки "Код"
Процедура ПослеРедактирования(Контекст, НомерСтроки, НомерКолонки, Значение)
    ИмяКолонки = Контекст.Контроль.ПолучитьИмяКолонки(НомерКолонки);
    Если ИмяКолонки = "КодТовара" Тогда
        // Здесь выполняется поиск товара в справочнике
        // и обновление соседней ячейки "Товар"
    КонецЕсли;
КонецПроцедуры

Метод 5: Переопределение стандартного подбора

Иногда самым эффективным решением оказывается не модификация самой таблицы, а создание удобной формы подбора. Выясним причину популярности этого метода: он позволяет пользователю работать в специализированном интерфейсе, где реализован полнотекстовый поиск или поиск по вхождению строки.

В этом случае в табличной части оставляется стандартное поле "Товар", но при начале выбора значения (процедура ПриНачалеВыбораЗначения) мы открываем свою форму подбора. В ней пользователь может быстро насканировать штрихкоды или ввести артикулы, а программа будет автоматически добавлять строки в основной документ.

Подводя итог, можно сказать: если ваша задача требует быстрого внедрения без установки сторонних компонент — используйте служебный реквизит в ТЧ. Если же вам нужен современный, быстрый и максимально удобный интерфейс, стоит обратить внимание на связку 1С++ и FormEx.

← На главную