Как заполнить табличную часть реквизитом формы

 +8 

   

Распечатать

Как заполнить табличную часть формы программно?

Нужно по кнопке Заполнить  — сформировать данные для заполнения табличных частей и заполнить их.

Форма имеет вид:

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

Код 1C v 8.2 УП

 // Код заполнения ТЧ
&НаСервере
Процедура ЗаполнитьДокументНаСервере()
ДокОбъект = РеквизитФормыВЗначение("Объект");
Запрос = Новый Запрос;
Запрос.Текст = 
"ВЫБРАТЬ РАЗЛИЧНЫЕ
| ЗаказНаПроизводствоПродукция.Ссылка КАК ЗаказНаПроизводство,
| СпецификацииОперации.Операция,
| СпецификацииОперации.W1C_КоличествоОпераций,
| СпецификацииОперации.W1C_СтоимостьОднойОперации
|ПОМЕСТИТЬ втЗаказОперацияСумма
|ИЗ
| Документ.ЗаказНаПроизводство.Продукция КАК ЗаказНаПроизводствоПродукция
| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Спецификации.Операции КАК СпецификацииОперации
| ПО ЗаказНаПроизводствоПродукция.Спецификация = СпецификацииОперации.Ссылка
|ГДЕ
| ЗаказНаПроизводствоПродукция.Ссылка В
| (ВЫБРАТЬ РАЗЛИЧНЫЕ
| W1C_ОтчетПоВыработкеНачисления.ЗаказПроизводство
| ИЗ
| Документ.W1C_ОтчетПоВыработке.Начисления КАК W1C_ОтчетПоВыработкеНачисления
| ГДЕ
| W1C_ОтчетПоВыработкеНачисления.Ссылка.Дата МЕЖДУ &ДатаН И &ДатаК)
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| W1C_ОтчетПоВыработкеНачисления.Ссылка.Организация,
| W1C_ОтчетПоВыработкеНачисления.Ссылка.Сотрудник,
| W1C_ОтчетПоВыработкеНачисления.ЗаказПроизводство,
| W1C_ОтчетПоВыработкеНачисления.Операция,
| W1C_ОтчетПоВыработкеНачисления.КоличествоПродукции КАК Количество,
| втЗаказОперацияСумма.W1C_СтоимостьОднойОперации КАК Цена,
| W1C_ОтчетПоВыработкеНачисления.Ссылка КАК ОтчетПоВыработке,
| втЗаказОперацияСумма.W1C_СтоимостьОднойОперации * W1C_ОтчетПоВыработкеНачисления.КоличествоПродукции КАК Сумма
|ИЗ
| Документ.W1C_ОтчетПоВыработке.Начисления КАК W1C_ОтчетПоВыработкеНачисления
| ЛЕВОЕ СОЕДИНЕНИЕ втЗаказОперацияСумма КАК втЗаказОперацияСумма
| ПО W1C_ОтчетПоВыработкеНачисления.ЗаказПроизводство = втЗаказОперацияСумма.ЗаказНаПроизводство
| И W1C_ОтчетПоВыработкеНачисления.Операция = втЗаказОперацияСумма.Операция
|ГДЕ
| W1C_ОтчетПоВыработкеНачисления.Ссылка.Дата МЕЖДУ &ДатаН И &ДатаК
| И W1C_ОтчетПоВыработкеНачисления.Ссылка.Организация = &Организация";

Запрос.УстановитьПараметр("ДатаК", КонецМесяца(ДокОбъект.ПериодРегистрации));
Запрос.УстановитьПараметр("ДатаН", НачалоМесяца(ДокОбъект.ПериодРегистрации));
Запрос.УстановитьПараметр("Организация", ДокОбъект.Организация);

РезультатЗапроса = Запрос.Выполнить();
ДокОбъект.Рассчет.Загрузить(Запрос.Выполнить().Выгрузить());
ОбновитьВыплату(ДокОбъект); //заполним данными вторую ТЧ
ЗначениеВРеквизитФормы(ДокОбъект, "Объект");

КонецПроцедуры

&НаСервере
Процедура ОбновитьВыплату(ДокОбъект)
врТЗ = ДокОбъект.Рассчет.Выгрузить();
врТЗ.свернуть("Сотрудник","Сумма");
ДокОбъект.Начисления.Загрузить(врТЗ);
КонецПроцедуры


Второй вариант заполнения: Имеем ТЧ на форме, которую необходимо программно заполнить

и код в модуле документа:

Код 1C v 8.2 УП

 &НаСервере
 Процедура НайтиТопливоф()
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |   СУММА(ПродажаТоплива.Номер) КАК Номер,
        |   ПродажаТоплива.ТипТоплива,
        |   СУММА(ПродажаТоплива.Количество) КАК Количество,
        |   СУММА(ПродажаТоплива.СуммаСНДС) КАК СуммаСНДС
        |ИЗ
        |   Документ.ПродажаТоплива КАК ПродажаТоплива
        |ГДЕ
        |   ПродажаТоплива.Цена <= &Цена
        |
        |СГРУППИРОВАТЬ ПО
        |   ПродажаТоплива.ТипТоплива";

      Запрос.УстановитьПараметр("Цена", Объект.Цена);

      Результат = Запрос.Выполнить();
     ВыборкаДетальныеЗаписи = Результат.Выбрать();
    Объект.ТЧ.Очистить();
    Пока ВыборкаДетальныеЗаписи.Следующий() Цикл  
   НовСтр = Объект.ТЧ.Добавить();
         ЗаполнитьЗначенияСвойств(НовСтр, ВыборкаДетальныеЗаписи); //при условии что имена полей ТЧ и выборки совпадают
    КонецЦикла;
КонецПроцедуры

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

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

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

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

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

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

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

&НаСервере
Процедура ЗаполнитьТоварамиНаСервере()

    Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ
                   |    Товары.Ссылка КАК Товар,
                   |    1 КАК Количество
                   |ИЗ
                   |    Справочник.Товары КАК Товары
                   |ГДЕ
                   |    НЕ Товары.ПометкаУдаления";
    Выборка = Запрос.Выполнить().Выбрать();
    Пока Выборка.Следующий() Цикл
        НовСтр = Объект.СписокТоваров.Добавить();
        ЗаполнитьЗначенияСвойств(НовСтр,Выборка);
    КонецЦикла;

КонецПроцедуры

&НаКлиенте
Процедура ЗаполнитьТоварами(Команда)
    ЗаполнитьТоварамиНаСервере();
КонецПроцедуры

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

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

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

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

Объект.СписокТоваров.Очистить();

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

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

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

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

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

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

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

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

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

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

&НаКлиенте
Процедура СписокТоваровЦенаПриИзменении(Элемент)
	ТекДанные = Элементы.СписокТоваров.ТекущиеДанные;
	Если ТекДанные = Неопределено Тогда
		Возврат; //если пустая таблица
	КонецЕсли;
	ТекДанные.Сумма = ТекДанные.Количество * ТекДанные.Цена;
КонецПроцедуры

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

&НаКлиенте
Процедура УмножитьНа2(Команда)
    ТекДанные = Элементы.СписокТоваров.ТекущиеДанные;
    Если ТекДанные = Неопределено Тогда
        Возврат; //если пустая таблица
    КонецЕсли;
    ТекДанные.Количество = ТекДанные.Количество * 2;
    ТекДанные.Сумма = ТекДанные.Количество * ТекДанные.Цена;
КонецПроцедуры

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

Идентификтор = Элементы.СписокТоваров.ТекущаяСтрока;
ИдентификторСлед = Идентификтор + 1;

Если ИдентификторСлед < Объект.СписокТоваров.Количество() Тогда
    Элементы.СписокТоваров.ТекущаяСтрока = ИдентификторСлед;
КонецЕсли;

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

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

&НаКлиенте
Процедура СписокТоваровКоличествоПриИзменении(Элемент)
    Идентификтор = Элементы.СписокТоваров.ТекущаяСтрока;
    Если Идентификтор = Неопределено Тогда
        Возврат;
    КонецЕсли;
    ТекСтрока = Объект.СписокТоваров.НайтиПоИдентификатору(Идентификтор);
    Если ТекСтрока = Неопределено Тогда
        Возврат;
    КонецЕсли;
    ТекСтрока.Сумма = ТекСтрока.Цена * ТекСтрока.Количество;
КонецПроцедуры

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

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

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

&НаКлиенте
Процедура УмножитьВсеНа2(Команда)

    ТабОбх = Объект.СписокТоваров;
    Для Каждого стрТабл из ТабОбх Цикл
        стрТабл.Количество = стрТабл.Количество * 2;
        стрТабл.Сумма = стрТабл.Цена * стрТабл.Количество;
    КонецЦикла;

КонецПроцедуры

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

Конфигурирование табличный частей объектов 1С

Справочники в 1С 8.3

Документы в 1С 8.3

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

Формы справочников в 1С 8.3

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

Книга «Программировать в 1С за 11 шагов»

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

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

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

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

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

Промо-код на скидку в 15% — 48PVXHeYu

Вступайте в мои группы:

Вконтакте: https://vk.com/1c_prosto
Фейсбуке: https://www.facebook.com/groups/922972144448119/
ОК: http://ok.ru/group/52970839015518
Твиттер: https://twitter.com/signum2009

Табличные части существуют у многих объектов в 1С:

  • Справочники
  • Документы
  • Отчеты и обработки
  • Планы счетов
  • Планы видов характеристик
  • Планы видов расчета
  • Бизнес-процессы и задачи

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

Рассмотрим некоторые приемы работы с табличными частями.

Как обойти табличную часть

Для обхода табличной части можно использовать цикл Для каждого

Для каждого Строка из ТабличнаяЧасть Цикл

Сообщить(Строка.РеквизитТабличнойЧасти);

КонецЦикла;

На каждой итерации в переменную Строка передается очередная строка табличной части. Значения реквизитов строки можно получить выражением Строка.ИмяРеквизита.

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

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

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

ВыделенныеСтроки=ЭлементыФормы.ИмяТабличногоПоля.ВыделенныеСтроки;

Для того чтобы обойти выделенные строки используется цикл Для каждого:

ВыделенныеСтроки=ЭлементыФормы.ИмяТабличногоПоля.ВыделенныеСтроки;

Для каждого Строка из ВыделенныеСтроки Цикл

//содержимое цикла

КонецЦикла;

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

Чтобы программно снять выделение строк табличного поля:

ЭлементыФормы.ИмяТабличногоПоля.ВыделенныйСтроки.Очистить();

Чтобы программно выделить все строки табличного поля:

Для каждого ТекущаяСтрока Из ТабличнаяЧасть Цикл
ЭлементыФормы.ИмяТабличногоПоля.ВыделенныеСтроки.Добавить(ТекущаяСтрока);
КонецЦикла;

Как очистить табличную часть

ТабличнаяЧасть.Очистить();

Как получить текущую строку табличной части

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

Для обычных форм код будет выглядеть так:

ЭлементыФормы.ИмяТабличногоПоля.ТекущиеДанные;

Для управляемых форм:

Элементы.ИмяТабличногоПоля.ТекущиеДанные;

Как добавить новую строку в табличную часть

Добавление новой строки в конец табличной части:

НоваяСтрока=ТабличнаяЧасть.Добавить();
НоваяСтрока.Реквизит1=«Значение»;

Добавление новой строки в любое место табличной части (последующие строки будут сдвинуты):

НоваяСтрока=ТабличнаяЧасть.Вставить(Индекс)
//Индекс — номер добавляемой строки. Нумерация строк начинается с нуля.

НоваяСтрока.Реквизит1=«Значение»;

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

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

Создаваемая обработчиком процедура имеет три параметра:

  • Элемент — содержит элемент управления ТабличноеПоле.
  • НоваяСтрока — булево. Содержит значение Истина, если добавляется новая строка табличной части, и Ложь, если пользователь начал редактировать уже существующую строку.
  • Копирование — булево. Содержит значение Истина, если пользователь копирует строку, и Ложь в остальных случаях.

Рассмотрим пример. Допустим, нам нужно заполнить реквизит табличной части СчетУчета, в случае, когда добавляется новая строка. При редактировании существующей строки изменять счет учета не нужно.

Процедура ТабличнаяЧастьПриНачалеРедактирования(Элемент, НоваяСтрока, Копирование)

//Если пользователь редактирует существующую строку, то ничего не делаем
Если НЕ НоваяСтрока Тогда
Возврат;
КонецЕсли;

//Если же строка новая, устанавливаем счет учета
ТекСтрока = Элемент.ТекущиеДанные; //Получили текущую строку табличной части
ТекСтрока.СчетУчета = ПланыСчетов.Хозрасчетый.НужныйСчетУчета;
КонецПроцедуры

Заполнение таблицы на форме 1с

Заполнить таблицу на форме 1с можно несколькими способами. Заполнение таблицы на форме 1с типовая операция, осуществляемая очень часто.

Заполнение таблицы на форме 1с
Форма документа
  1. Используя строку таблицы и Текущие данные
  2. Используя всю таблицу

В первом случае данными заполняется одна текущая строка таблицы. Для столбца Номенклатура таблицы СписокНоменклатуры определяем событие при изменении:

Заполнение таблицы на форме 1с
Событие столбца Номенклатура

Код в модуле формы выглядит так:

Заполнение таблицы на форме 1с

Код процедуры

Данный код можно и нужно поместить в отдельную процедуру и к ней обращаться из событий При изменении Номенклатуры и старой цены.

Перебор строк табличной части документа

Во-втором случае добавляем кнопку на форму. При помощи процедуры кнопки производится пересчет всех цен в таблице. Пересчет выполняется при помощи оператора цикла Для Каждого:

Заполнение таблицы на форме 1с

Код с использованием цикла Для каждого

Работа с таблицей на форме

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

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

Однако для выполнения более сложных или массовых операций требуется доступ непосредственно к данным формы, то есть к ее реквизиту. Реквизит формы может иметь разный тип – например, в случае табличной части это будет ДанныеФормыКоллекция, а в случае дерева значений – ДанныеФормыДерево. Сути дела это не меняет.

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

СтрокаКоллекции = Объект.Товары.НайтиПоИдентификатору(Элементы.Товары.ТекущаяСтрока);

ИндексСтрокиКоллекции = Объект.Товары.Индекс(СтрокаКоллекции);
//условие
Если Объект.Товары.Количество() > ИндексСтрокиКоллекции + 1 Тогда
//последовательность операторов
КонецЕсли

Заполнение суммы документа

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

&НаКлиенте
Процедура СписокНоменклатурыНоменклатураПриИзменении(Элемент)
	// Вставить содержимое обработчика.
	объект.СуммаПоДокументу=объект.СписокНоменклатуры.Итог("Сумма");
КонецПроцедуры
Заполнение таблицы на форме 1с
Заполнение суммы документа 1с

В статье рассмотрели два варианта изменения цены номенклатуры на форме. Выполнили заполнение таблицы на форме 1с. Настроили автоматическое вычисление поля сумма документа на основе таблицы документа.

УФ: Заполнение реквизита табличной части документа

Я
   егаис

24.05.16 — 08:46

Есть у формы реквизит табличной части. Необходимо его заполнить при заполнении табличной части объекта (&насервере). Как это сделать правильно для 8.3? Честно, впервые сталкиваюсь с такой задачей, в 8.2 были обработчики ТЧ и формы. Спасибо

  

Партнерская программа EFSOL Oblako

   RomaH

1 — 24.05.16 — 08:57

бред какой-то

у формы не бывает ТЧ

что за обработчик ТЧ?

   RomaH

2 — 24.05.16 — 09:00

в смысле добавил в ТЧ объекта колонку реквизита? в форме?

http://dl.dropbox.com/u/70454663/2016-05-24_08h58_57.png

в чем проблема-то?

   Fedor-1971

3 — 24.05.16 — 09:01

(0) так же как и на 8.2, перебираешь строки ТЧ и заполняешь реквизиты, если массово.

   егаис

4 — 24.05.16 — 09:01

у объекта есть ТЧ

У ТЧ есть реквизит формы

Этот реквизит надо заполнить при заполнении табличной части

Раньше были обработки приполученииданных, например

   RomaH

5 — 24.05.16 — 09:02

ПриСоздании

ПередОкончаниемРедактирования

ПриЗаписиНаСервере

   RomaH

6 — 24.05.16 — 09:03

Не При, а ПОслеЗаписиНаСервере

   егаис

7 — 24.05.16 — 09:03

(3),(5) понятно, спасибо

   Fedor-1971

8 — 24.05.16 — 09:03

(5) погоди, не так быстро, ТС из обычных форм переходит на управляемые

   егаис

9 — 24.05.16 — 09:05

(8) а что годить

я так понял

1) надо вешать обработчики при изменении «нужных реквизитов через Элементы.ТЧ.ТекущиеДанные

2) НаСервереБезКонтекста заполнять при заполнении ТЧ

   егаис

10 — 24.05.16 — 09:06

на обычных формах было проще через ОформлениеСтроки

   RomaH

11 — 24.05.16 — 09:11

без контекста вроде как не получится

  

Fedor-1971

12 — 24.05.16 — 09:11

(9) в общем правильно, но строку ТЧ на сервер не передать, соответственно нужна функция НаСервреБезКонтекста, которая получит некие параметры и вернёт значение для заполнения твоего реквизита.

Посмотри по решаемой задаче, возможно, дешевле будет использовать контекстный вызов или будет достаточно работы НаКлиенте

Оптимист верит, что мы живем в лучшем из миров. Пессимист боится, что так оно и есть.

Автоматическое заполнение табличной части документа

Автор Gregory78, 14 авг 2014, 19:34

0 Пользователей и 1 гость просматривают эту тему.

Всем привет! Подскажите: как программным способом заполнить табличную часть документа данными из справочника «Сотрудники»?

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

Затем повесил на форму событие «При открытии». Перебираю массив циклом, и… дальше не хватает знаний.
Каким образом мне обратиться к ТЧ «СписокСотрудников»? Как к «Элементы.СписокСотрудников» или как «Объект.СписокСотрудников» (в последнем случае процедуру заменить на серверную)? Пытался через синтакс-помощник найти подходящие методы, но пока безрезультатно.

Была еще идея вставить вместо ТЧ динамический список — это получается легко… но мне нужны рядом с фамилией каждого сотрудника еще и реквизит типа «булево», редактируемый пользователем. Вот с этим тоже все сложно. (

В общем, цель такая: при открытии формы документа табличная часть должна автоматически заполниться списком сотрудников (циклом — создается строка, в реквизит «ФИО» вставляются данные из массива, данные записываются), чтобы пользователю осталось только выставить галочки на булевых реквизитах.
Работаю в 1С 8.2.


после выполнения запроса у вас будет ТаблицаЗначений. Далее необходимо получить документ (или создать), который будете заполнять. и
Для каждого стр из ТЗ Цикл
НоваяСтрока = Документ.ТЧ.Добавить();
НоваяСтрока.ФИО = стр.ФИО;
и т.д.


&НаКлиенте
Процедура ПриОткрытии(Отказ)

ЗаполнитьТабличнуюЧасть();

КонецПроцедуры

&НаСервере
Процедура ЗаполнитьТабличнуюЧасть()
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Сотрудники.Наименование
|ИЗ
| Справочник.Сотрудники КАК Сотрудники";

РезультатЗапроса = Запрос.Выполнить().Выгрузить()

Для каждого Стр из РезультатЗапроса Цикл
НоваяСтрока = Объект.ТабличнаячЧасть.Добавить();
НоваяСтрока.ФИО = Стр.Наименование;
КонецЦикла
КонецПроцедуры

Cегодня не все могут провести завтрашним числом. Вернее, не только лишь все — мало кто может это сделать.


Спасибо за подробный ответ! Но почему-то не все тут срабатывает. Создаются строки (их количество соответствует числу сотрудников), но поля остаются пустыми. Проверил с точкой останова, вроде все должно быть правильно. Жму Shift+F9 (вычислить выражение), получаю:
Стр.Наименование — видна фамилия сотрудника, тип — строка;
НоваяСтрока — ДанныеФормыЭлементКоллекции;
НоваяСтрока.Сотрудник — СправочникСсылка.Сотрудники

Но хоть убей, не видны эти сотрудники в форме!
Ковырялся еще сам, поместил весь код в одну процедуру «При создании на сервере». Попробовал использовать метод «Выбрать» вместо «Выгрузить», изменил обход результата запроса:

        Результат =  Запрос.Выполнить().Выбрать();
   Пока Результат.Следующий() Цикл
   НоваяСтрока = Объект.СписокСотрудников.Добавить();
   НоваяСтрока.Сотрудник = Результат.Наименование;

Но в итоге суть та же, все это как мертвому припарка. Последняя строка «НоваяСтрока.Сотрудник = Результат.Наименование;» не срабатывает. У кого-нибудь есть еще соображения?


Цитата: Gregory78 от 18 авг 2014, 21:55
Спасибо за подробный ответ! Но почему-то не все тут срабатывает. Создаются строки (их количество соответствует числу сотрудников), но поля остаются пустыми. Проверил с точкой останова, вроде все должно быть правильно. Жму Shift+F9 (вычислить выражение), получаю:
Стр.Наименование — видна фамилия сотрудника, тип — строка;
НоваяСтрока — ДанныеФормыЭлементКоллекции;
НоваяСтрока.Сотрудник — СправочникСсылка.Сотрудники

Но хоть убей, не видны эти сотрудники в форме!
Ковырялся еще сам, поместил весь код в одну процедуру «При создании на сервере». Попробовал использовать метод «Выбрать» вместо «Выгрузить», изменил обход результата запроса:

        Результат =  Запрос.Выполнить().Выбрать();
   Пока Результат.Следующий() Цикл
   НоваяСтрока = Объект.СписокСотрудников.Добавить();
   НоваяСтрока.Сотрудник = Результат.Наименование;

Но в итоге суть та же, все это как мертвому припарка. Последняя строка «НоваяСтрока.Сотрудник = Результат.Наименование;» не срабатывает. У кого-нибудь есть еще соображения?

Что будет, если ты попытаешься записать строку «абв» в переменную числового типа?
Вот и подумай, почему у тебя строка не записывается в переменную ссылочного типа.


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


А в Табличной Части это поле, куда вы записываете это ссылка на справочник Сотрудники? Или строковое?


Цитата: Gregory78 от 19 авг 2014, 16:10
Каким образом тогда получить ссылочные значения? Получить строку и каким-то образом выполнить поиск по справочнику, а полученный результат поместить в переменную?

Текст запроса то какой? Поди в запросе вместо ссылки наименование получаете


НоваяСтрока.Сотрудник —
СправочникСсылка.Сотрудники
Стало быть, не строка, а ссылка.

Добавлено: 20 авг 2014, 07:47


[/quote]
Текст запроса то какой? Поди в запросе вместо ссылки наименование получаете
[/quote]

Да, запросом получаю наименование . Так! Может быть, вместо наименования выбрать ссылку?

ВЫБРАТЬ
Сотрудники.Ссылка
ИЗ
Справочник.Сотрудники КАК Сотрудники
???
Надо будет попробовать.



Файлы материала
Описание

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

Программное добавление реквизита на форму

Для примера, стоит задача в конфигурации ЗУП 3.1 добавить реквизит «Способ отражения зарплаты в БУ» для позиции штатного расписания в группе “Дополнительные данные”.

Способ отражение в позиции штатного расписания

Создадим расширение и выполним следующую последовательность действий:

  1. Добавим в расширение справочник “Штатное расписание” и создадим реквизит “АВ_СпособОтражения” с типом данных “СправочникСсылка.СпособыОтраженияЗарплатыВБухУчете”

добавление реквизита АВ_СпособОтражения в расширение

2. Заберем в расширение процедуру “ПриСозданииНаСервере” из общего модуля “УправлениеСвойствами”, программно добавим поле в форму и свяжем его с реквизитом объекта добавленного на первом шаге.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

&После(«ПриСозданииНаСервере»)

Процедура АВ_ПриСозданииНаСервере(Форма, ДополнительныеПараметры)

Если Форма.ИмяФормы = «Справочник.ШтатноеРасписание.Форма.ФормаЭлемента» Тогда

#Область ДобавлениеЭлементовФормы

ИмяГруппы = «ГруппаДополнительныеРеквизиты»;

ГруппаФормы = Форма.Элементы.Найти(ИмяГруппы);

Если ГруппаФормы <> Неопределено Тогда

ИмяЭлемента = «АВ_СпособОтражения»;

Если Форма.Элементы.Найти(ИмяЭлемента) = Неопределено Тогда

ЭлементФормы = Форма.Элементы.Добавить(ИмяЭлемента, Тип(«ПолеФормы»), ГруппаФормы);

//Вместо Добавить() можно использовать метод Вставить()

//в 4-й параметре указывается Элемент перед которым должен быть вставлен новый элемент.

//ЭлементФормы = Форма.Элементы.Вставить(ИмяЭлемента, Тип(«ПолеФормы»), ГруппаФормы, Форма.Элементы.Найти(«ИмяСледующегоЭлементаФормы»));

ЭлементФормы.Вид = ВидПоляФормы.ПолеВвода;

ЭлементФормы.ПутьКДанным = «Объект.АВ_СпособОтражения»;

//ЭлементФормы.МногострочныйРежим = Истина;

//ЭлементФормы.Высота = 3;

КонецЕсли;

КонецЕсли;

#КонецОбласти

КонецЕсли;

КонецПроцедуры

Образец расширения для скачивания в начале описания.

Программное добавление реквизита в табличную часть формы

Например, таким же способом, добавим в табличную часть “Рабочие места” реквизит “Спецжиры” с типом “Булево”.

Результат спецоценки условий труда с  колонкой спецжиры

Добавление реквизита в табличную часть

&После(«ПриСозданииНаСервере»)

Процедура АВ_ПриСозданииНаСервере(Форма, ДополнительныеПараметры)

Если Форма.ИмяФормы = «Документ.РезультатыСпецоценкиУсловийТруда.Форма.ФормаДокумента» Тогда

#Область ДобавлениеЭлементовФормы

ИмяЭлемента = «АВ_ЕстьСпецжиры»;

Если Форма.Элементы.Найти(ИмяЭлемента) = Неопределено Тогда

ЭлементФормы = Форма.Элементы.Добавить(«Спецжиры», Тип(«ПолеФормы»), Форма.Элементы.РабочиеМеста);        

ЭлементФормы.Вид = ВидПоляФормы.ПолеФлажка;

ЭлементФормы.ПутьКДанным = «Объект.РабочиеМеста.АВ_ЕстьСпецжиры»;

//ЭлементФормы.ТолькоПросмотр = Истина;

КонецЕсли;

#КонецОбласти

КонецЕсли;

КонецПроцедуры

В результате получим табличную часть с новой колонкой.

Программное добавление табличной части на форму

Аналогично добавим табличную часть “АВ_ВредныеФакторы” на форму справочника “Профессии”.

Табличная часть добавленная через расширение

Добавление табличной части на форму

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

&После(«ПриСозданииНаСервере»)

Процедура АВ_ПриСозданииНаСервере(Форма, ДополнительныеПараметры)

Если Форма.ИмяФормы = «Справочник.ПрофессииРабочих.Форма.ФормаЭлемента» Тогда

#Область ДобавлениеЭлементовФормы

ИмяГруппы = «ГруппаДополнительныеРеквизиты»;

ГруппаФормы = Форма.Элементы.Найти(ИмяГруппы);

Если ГруппаФормы <> Неопределено Тогда

ИмяЭлемента = «АВ_ВредныеФакторы»;

Если Форма.Элементы.Найти(ИмяЭлемента) = Неопределено Тогда   

ЭлементФормыТаблица = Форма.Элементы.Добавить(ИмяЭлемента, Тип(«ТаблицаФормы»), ГруппаФормы);  

ЭлементФормыТаблица.ПутьКДанным = «Объект.АВ_ВредныеФакторы»;

ЭлементФормы = Форма.Элементы.Добавить(«ВредныйФактор», Тип(«ПолеФормы»), ЭлементФормыТаблица);

ЭлементФормы.Вид = ВидПоляФормы.ПолеВвода;

ЭлементФормы.ПутьКДанным = «Объект.АВ_ВредныеФакторы.ВредныйФактор»;    

КонецЕсли;

КонецЕсли;

#КонецОбласти

КонецЕсли;

КонецПроцедуры

Связь реквизитов формы с элементами формы

Кроме того, реквизиты формы можно создавать программно и связывать их с элементами формы

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

#Область ДобавлениеРеквизитовФормы

// Массив для новых реквизитов

ДобавляемыеРеквизиты = Новый Массив;

// Опишем ревизиты формы

Реквизит_РабочееМесто = Новый РеквизитФормы(«АВ_РабочееМесто», Новый ОписаниеТипов(«СправочникСсылка.РабочиеМестаОхраныТруда»), , «Рабочее место»);

// Заполним массив после описания реквизитов формы

ДобавляемыеРеквизиты.Добавить(Реквизит_РабочееМесто);

// Добавим новые реквизиты в форму

Форма.ИзменитьРеквизиты(ДобавляемыеРеквизиты);

#КонецОбласти

#Область ДобавлениеЭлементовФормы

...

#КонецОбласти

#Область ЗаполнениеДанных

Форма.АВ_РабочееМесто = Форма.Объект.АВ_РабочееМесто;

#КонецОбласти


Расширения, Типовые приемы, Шаблоны и заготовки

Понравилась статья? Поделить с друзьями:
  • Как запросить документы у управляющей компании
  • Как зарабатывать на бизнес аккаунте в тик токе
  • Как зарегистрировать в контакте бизнес аккаунт
  • Как зарегистрировать в телеграм бизнес аккаунт
  • Как зарегистрировать компанию в китае русскому