Как программно записать выбранное значение в ячейку табличного документа

Программист 1С v8.3 (Управляемые формы)
← На главную

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

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

Способ 1. Использование промежуточного реквизита формы

Разберем самый доступный метод. Когда пользователь дважды кликает по ячейке или нажимает кнопку выбора, срабатывает событие РезультатВыбор (если ваш табличный документ называется «Результат»). Проблема заключается в том, что процедура выбора заканчивается сразу после открытия формы справочника, и когда пользователь выберет элемент, программа «забудет», на какую именно ячейку нажимали.

Чтобы обойти это, мы проанализируем ситуацию и сохраним адрес ячейки в специально созданный реквизит формы (например, с именем ВыбраннаяЯчейка, тип «Строка»).

Рассмотрим пример кода:


&НаКлиенте
Процедура РезультатВыбор(Элемент, Область, СтандартнаяОбработка)
    
    СтандартнаяОбработка = Ложь; // Отключаем стандартное поведение
    
    // Сохраняем адрес ячейки, чтобы использовать его позже
    ВыбраннаяЯчейка = Область.Имя; 
    
    ПараметрыВыбора = Новый Структура("РежимВыбора", Истина);
    ОткрытьФорму("Справочник.Номенклатура.ФормаВыбора", ПараметрыВыбора, ЭтаФорма);
    
КонецПроцедуры

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

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


&НаСервереБезКонтекста
Функция ПолучитьАртикулНаСервере(СсылкаНоменклатуры)
    Возврат СсылкаНоменклатуры.Артикул;
КонецФункции

Способ 2. Передача контекста через ОписаниеОповещения

Проанализируем более продвинутый способ, который рекомендует фирма «1С» для управляемых форм. Вместо того чтобы загромождать форму лишними реквизитами, мы можем передать «адрес» ячейки напрямую в процедуру обратного вызова (callback). Это делает код более автономным и надежным.

Для этого в событии выбора мы создадим структуру ДополнительныеПараметры и передадим в неё объект Область или координаты ячейки.


&НаКлиенте
Процедура РезультатВыбор(Элемент, Область, СтандартнаяОбработка)
    
    СтандартнаяОбработка = Ложь;
    
    // Подготовим данные о ячейке
    ДопПараметры = Новый Структура;
    ДопПараметры.Вставить("ИмяОбласти", Область.Имя);
    ДопПараметры.Вставить("Ряд", Область.Верх);
    ДопПараметры.Вставить("Колонка", Область.Лево);
    
    Оповещение = Новый ОписаниеОповещения("ПослеВыбораНоменклатуры", ЭтотОбъект, ДопПараметры);
    
    ПараметрыВыбора = Новый Структура("РежимВыбора", Истина);
    ОткрытьФорму("Справочник.Номенклатура.ФормаВыбора", ПараметрыВыбора, ЭтаФорма, , , , Оповещение);
    
КонецПроцедуры

&НаКлиенте
Процедура ПослеВыбораНоменклатуры(ВыбранноеЗначение, ДополнительныеПараметры) Экспорт
    
    Если ВыбранноеЗначение <> Неопределено Тогда
        Артикул = ПолучитьАртикулНаСервере(ВыбранноеЗначение);
        
        // Обращаемся к ячейке по координатам, переданным в параметрах
        Ячейка = Элементы.Результат.Область(ДополнительныеПараметры.Ряд, ДополнительныеПараметры.Колонка);
        Ячейка.Текст = Артикул;
    КонецЕсли;
    
КонецПроцедуры

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

Способ 3. Интерактивная настройка ячейки (без лишнего кода)

Выясним причину, по которой многие программисты пишут много кода там, где можно обойтись настройками свойств. Если ваш Табличный документ используется как рабочее пространство (аналог Excel внутри 1С), вы можете превратить ячейку в полноценное поле ввода.

Для этого необходимо выполнить следующие шаги:

  1. Установите для ячейки (или колонки) свойство СодержитЗначение в значение Истина.
  2. Задайте ТипЗначения (например, СправочникСсылка.Номенклатура).
  3. Установите флаг КнопкаВыбора в значение Да.
  4. В свойстве РежимРедактирования выберите Вход в редактирование при выборе.

В этом случае 1С сама отобразит кнопку с тремя точками в ячейке. Когда пользователь выберет номенклатуру, она запишется в свойство ячейки Значение. Вам останется только обработать событие ПриИзменении табличного документа, чтобы обновить текстовое представление или подтянуть другие реквизиты.


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

Важные нюансы при работе с Табличным Документом

Рассмотрим подробнее важные свойства, которые влияют на возможность записи данных:

Проанализируем также использование координат R1C1. Если вы формируете таблицу динамически, у ячеек может не быть имен. В этом случае всегда используйте метод Область(Ряд, Колонка). Помните, что индексация строк и колонок в 1С начинается с 1.

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

← На главную