1с как обратиться к табличной части справочника
Перейти к содержимому

1с как обратиться к табличной части справочника

  • автор:

Программная обработка табличных частей объектов в 1С 8.3

В предыдущей статье мы узнали, как настраивать и конфигурировать табличные части объектов 1С 8.3. В этой статье мы изучим некоторые вопросы программной работы с табличными частями 1С.

Заполнение табличной части 1С 8.3

Очень часто встречается задача заполнить табличную часть какими-нибудь значениями, например результатом выполнения запроса. Для демонстрации реализуем пример, в котором выполняется заполнение табличной части. Сделаем небольшую учебную задачу: будем заполнять табличную часть документа всей номенклатурой, которая не помечена на удаление. Количество при этом будет равно 1. Для заполнения табличной части документа нам необходимо работать с одноименной таблицей реквизита Объект, который является основным реквизитом управляемой формы.

Табличная часть реквизита Объект

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

Команда 1С и размещение её на форме

Исполнение команды будет выполняться в серверном контексте, поскольку объект Запрос не работает в клиентском контексте на тонком клиенте.

При обходе запроса, я использую метод Добавить табличной части объекта (вообще это метод объекта, который имеет тип ДанныйФормыКоллекция, именно в этот тип преобразуется табличная часть документа-объекта, при создании на сервере). Данный метод является функцией, которая создаёт и возвращает новую строку.

Обратите внимание, поскольку при обходе запроса и заполнения новой строки, я использую метод ЗаполнитьЗначенияСвойств, то поля в запросе должны называться так же, как и поля табличной части.

Очистка табличной части документа 1С 8.3

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

После выполнения этого метода вся табличная часть будет очищена.

Текущая строка табличной части 1С 8.3

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

Текущая строка табличной части 1С 8.3

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

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

Возврат полей свойством ТекущиеДанные

Для того, чтобы отработать изменение текущего поля цены, создадим обработчик события ПриИзменении этого поля.

Обработчик ПриИзменении поля таблицы формы

В этом обработчике напишем код, который будет пересчитывать значения полей текущей строки табличной части.

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

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

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

Также при помощи текущей строки можно находить аналогичную строку в соответствующей табличной части основного реквизита формы Объект, которую также можно изменять (строка на форме тоже изменится автоматически). Мы ранее сделали пересчет суммы при изменении цены, теперь сделаем пересчет суммы при изменении количества, но напрямую через реквизит Объект.

В этом коде мы используем метод НайтиПоИдентификатору переменной Объект.СписокТоваров, которая имеет типа ДанныйФормыКоллекция, этот метод получает элемент коллекции по указанному идентификатору. Если этот элемент найден, то мы можем с ними работать, причем данные на форме изменяться автоматически.

Обход табличной части 1С

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

Остальные статьи по теме конфигурирования в 1С:

Более подробно и основательно конфигурирование в 1С дается в моей книге:

Изучайте программирование в 1С в месте с моей книги «Программировать в 1С за 11 шагов»

  1. Книга написана понятным и простым языком — для новичка.
  2. Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
  3. Научитесь понимать архитектуру 1С;
  4. Станете писать код на языке 1С;
  5. Освоите основные приемы программирования;
  6. Закрепите полученные знания при помощи задачника;

О том как разрабатывать под управляемым приложением 1С, читайте в книге Книга «Основы разработки в 1С: Такси»

Отличное пособие по разработке в управляемом приложении 1С, как для начинающих разработчиков, так и для опытных программистов.

Программная работа со справочниками

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

Создание элемента справочника

Создание новых элементов и групп справочника производится с помощью программного объекта СправочникМенеджер.<Имя справочника>. Данный объект доступен только на сервере.
Создание нового элемента или группы справочника состоит из следующих этапов:

  1. Создание элемента или группы;
  2. Заполнение владельца (если справочник подчиненный);
  3. Заполнение родителя (если справочник иерархический);
  4. Заполнение наименования и реквизитов (если не задана автоматическая нумерация, то и кода);
  5. Заполнение табличных частей;
  6. Запись элемента.

Создание новой группы:
НоваяГруппа = Справочники . Контрагенты . СоздатьГруппу (); // Создание группы
НоваяГруппа . Наименование = «Покупатели» ; // Заполнение наименования
НоваяГруппа . Записать (); // Запись группы

Создание нового элемента:
НовыйЭлемент = Справочники . Контрагенты . СоздатьЭлемент (); // Создание элемента
НовыйЭлемент . Родитель = Справочники . Контрагенты . НайтиПоНаименованию ( «Покупатели» ); // Заполнение родителя
НовыйЭлемент . Наименование = «Ромашка ООО» ; // Заполнение наименования
НовыйЭлемент . ИНН = «123456789» ; // Заполнение реквизита

// Добавление новой строки табличной части
НоваяСтрока = НовыйЭлемент . КонтактнаяИнформация . Добавить ();
НоваяСтрока . Тип = «Адрес» ;
НоваяСтрока . Представление = «Москва» ;

НовыйЭлемент . Записать (); // Запись элемента

Поиск элементов справочника

Для поиска элементов справочников в языке программирования 1С предусмотрено несколько методов:

  • НайтиПоКоду (< Код >, < ПоискПоПолномуКоду >, < Родитель >, < Владелец >)
  • НайтиПоНаименованию (< Наименование >, < ТочноеСоответствие >, < Родитель >, < Владелец >)
  • НайтиПоРеквизиту (< ИмяРеквизита >, < ЗначениеРеквизита >, < Родитель >, < Владелец >)

Во всех методах если поиск успешный, то будет возвращена ссылка на найденный элемент.
НайденныйКонтрагент = Справочники . Контрагенты . НайтиПоКоду ( «123» ); // Поиск контрагента с кодом «123»
НайденныйДоговор = Справочники . ДоговорыКонтрагентов . НайтиПоКоду ( «1» , , , НайденныйКонтрагент ); // Поиск подчиненного найденному контрагенту договора с номером «1»
НайденныйКонтрагент = Справочники . Контрагенты . НайтиПоНаименованию ( «Покупатели» ); // Поиск элемента с наименованием «Покупатели»
НайденныйКонтрагент1 = Справочники . Контрагенты . НайтиПоНаименованию ( «Ромашка ООО» , , НайденныйКонтрагент ); // Поиск элемента с наименованием «Ромашка ООО» в группе «Покупатели»
НайденныйКонтрагент = Справочники . Контрагенты . НайтиПоРеквизиту ( «ИНН» , «123456789» ); // Поиск контрагента с ИНН «123456789»

Изменение элементов справочника

Для изменения реквизитов справочника необходимо выполнить следующие действия:

  1. Получить объект элемента справочника (метод ПолучитьОбъект () , возвращает тип СправочникОбъект.<Имя справочника>);
  2. Присвоить новые значения реквизитам объекта;
  3. Записать объект элемента справочника.

Программное изменение справочника возможно только на стороне сервера.

Например, на форму обработки выведен реквизит Номенклатура типа СправочникСсылка.Номенклатура. Вот пример кода, изменяющего наименование выбранной пользователем номенклатуры:
НоменклатураОбъект = Номенклатура . ПолучитьОбъект ( );
НоменклатураОбъект . Наименование = «Новое наименование» ;
НоменклатураОбъект . Записать ();

Удаление элементов справочника

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

Непосредственное удаление – операция необратимая, в то время как пометку на удаление можно отменить. Пометка на удаление хранится в предопределенном реквизите ПометкаУдаления . В пользовательском режиме помеченные на удаление элементы и группы справочника помечаются красным крестиком.

Пометку на удаление можно установить/снять двумя разными способами:
// Способ 1. Использование метода УстановитьПометкуУдаления()
НайденныйКонтрагент = Справочники . Контрагенты . НайтиПоКоду ( «123» );
КонтрагентОбъект = НайденныйКонтрагент . ПолучитьОбъект ();
КонтрагентОбъект . УстановитьПометкуУдаления (Истина);

// Способ 2. Изменение свойства ПометкаУдаления
НайденныйКонтрагент = Справочники . Контрагенты . НайтиПоКоду ( «123» );
КонтрагентОбъект = НайденныйКонтрагент . ПолучитьОбъект ();
КонтрагентОбъект . ПометкаУдаления = Истина;
КонтрагентОбъект . Записать ();

Пример непосредственного удаления элемента справочника:
НайденныйКонтрагент = Справочники . Контрагенты . НайтиПоКоду ( «123» );
КонтрагентОбъект = НайденныйКонтрагент . ПолучитьОбъект ();
КонтрагентОбъект . Удалить ();

Обход элементов справочника

Для обхода элементов справочника в языке программирования 1С предусмотрено два метода:

  • Выбрать (< Родитель >, < Владелец >, < Отбор >, < Порядок >)
  • ВыбратьИерархически (< Родитель >, < Владелец >, < Отбор >, < Порядок >)

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

Рассмотрим примеры обхода элементов справочника:
// Обход всех элементов справочника Контрагенты
Выборка = Справочники . Контрагенты . Выбрать (); // Получение выборки всех элементов справочника
Пока Выборка . Следующий () Цикл
//действия с очередным элементом
Сообщить ( Выборка . Наименование );
КонецЦикла;

// Обход контрагентов из группы «Покупатели»
ГруппаПокупатели = Справочники . Контрагенты . НайтиПоНаименованию ( «Покупатели» );
Выборка = Справочники . Контрагенты . Выбрать ( ГруппаПокупатели );
Пока Выборка . Следующий () Цикл
Сообщить ( Выборка . Наименование );
КонецЦикла;

// Обход договоров контрагента «Ромашка ООО»
НайденныйКонтрагент = Справочники . Контрагенты . НайтиПоНаименованию ( «Ромашка ООО» );
Выборка = Справочники . ДоговорыКонтрагентов . Выбрать (, НайденныйКонтрагент );
Пока Выборка . Следующий () Цикл
Сообщить ( Выборка . Наименование );
КонецЦикла;

// Обход контрагентов с пустым ИНН
// Реквизит ИНН должен быть проиндексирован!
Отбор = Новый Структура ( «ИНН» , «» ); // Структура может содержать только один элемент
Выборка = Справочники . Контрагенты . Выбрать (, , Отбор );
Пока Выборка . Следующий () Цикл
Сообщить ( Выборка . Наименование );
КонецЦикла;

Выбор элементов справочника запросом

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

Простой пример поиска и вывода товаров со стоимостью больше 1000:
Запрос = Новый Запрос ;
Запрос . Текст =
«ВЫБРАТЬ
| Товары.Наименование
|ИЗ
| Справочник.Товары КАК Товары
|ГДЕ
| Товары.Стоимость > 1000″ ;
Выборка = Запрос . Выполнить (). Выбрать ();
Пока Выборка . Следующий () Цикл
Сообщить ( Выборка . Наименование );
КонецЦикла;

Открытие форм справочника

Для открытия любых форм справочников рекомендуется использовать метод
ОткрытьФорму (< ИмяФормы >, < Параметры >, < Владелец >, < Уникальность >, < Окно >, < НавигационнаяСсылка >, < ОписаниеОповещенияОЗакрытии >, < РежимОткрытияОкна >)

Для открытия формы элемента или группы справочника также возможно использовать более простой метод
ПоказатьЗначение (< ОписаниеОповещенияОЗавершении >, < Значение >)

Кроме методов ОткрытьФорму () и ПоказатьЗначение () есть и другие (ОткрытьФормуМодально, ОткрытьЗначение, ПолучитьФорму), но их использование не рекомендуется, т.к. часть этих методов использует режим модального открытия, часть противоречит свежим рекомендациям фирмы 1С.

Приведем примеры программного открытия форм справочника:
// Открыть форму списка
ОткрытьФорму ( «Справочник.Контрагенты.ФормаСписка» );

// Открыть форму элемента
// Контрагент – реквизит формы, заполняемый пользователем интерактивно
ПоказатьЗначение (, Контрагент );

// Еще один способ открытия формы элемента
ПараметрыОткрытия = Новый Структура ( «Ключ» , Контрагент );
ОткрытьФорму ( «Справочник.Контрагенты.Форма.ФормаЭлемента» , ПараметрыОткрытия );

// Открыть форму группы
// ГруппаКонтрагентов– реквизит формы, заполняемый пользователем интерактивно
ПоказатьЗначение (, ГруппаКонтрагентов );

// Еще один способ открытия формы группы
ПараметрыОткрытия = Новый Структура ( «Ключ» , ГруппаКонтрагентов );
ОткрытьФорму ( «Справочник.Контрагенты.Форма.ФормаГруппы» , ПараметрыОткрытия );

Внимание!

Следует понимать, что интерактивная работа (в том числе открытие форм) в 1С возможна только на стороне клиента. В то же время поиск и изменение данных возможны только на стороне сервера.

Как обратится к табличной части в 8.3?

Есть табличная часть нового документа. Назовем ее просто ТачЧасть.

В форме документа в версии 8.1 (когда писал последний раз лет цать назад).
Я мог просто написать н-р ТабЧасть.Выбратьстроки().
Такое обращение проходит только из модуля документа.

Подскажите пожалуйства, как сейчас это делать из формы документа?

п.с. И еще даже кнопку вставить не получается в форму.
Там просто нет поля, которое указывает на выполнение какой-то процедуры. Мама дорогая-)

можно все таки синаксис плз.
Очень надо.

Нужно пройтись по всем строкам именно нового документа выполнить с каждой простое арифметическое действие перед записью.

Допустим сложить в КолонкуЦ КолонкуА и КолонкуБ
Как я понял в модуле формы это больше не сделать? надо топать в модуль документа?

Почитал бы ты книжки, человек не из Ейска. Стыдно тебе, такому крутому, понимаю, но если очень надо, то придется.

Добавить комментарий

Ваш адрес email не будет опубликован.