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

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

Я
   milk it

08.09.06 — 22:35

Подскажите, пожалуйста, а то документации под рукой нет, и в v8 я чайник.

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

И можно ли давать одинаковое имя основным реквизитам и реквизитам табличной части одного объекта?

  

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

   Моха Лёхов

1 — 08.09.06 — 22:37

К элементу формы или реквизиту документа/справочника?

   milk it

2 — 08.09.06 — 22:42

К реквизиту справочника

   Моха Лёхов

3 — 08.09.06 — 22:44

+(1)

К реквизиту: ИмяТаблчасти.ИмяКолонки (выбирать можно, например в цикле ДляКаждого)

К эл.формы: ЭлементыФормы.ИмяТаблчасти… не помню дальше, см. хэлп :).

   Моха Лёхов

4 — 08.09.06 — 22:45

ИмяТаблчасти — таблица значений (стандартная коллекция) см. хэлп

   milk it

5 — 08.09.06 — 22:54

(3)

Судя по тому что написано в хелпе — ИмяКолонки — это свойство объекта СтрокаТаблицыЗначений. А как к строке обратиться?

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

   Моха Лёхов

6 — 08.09.06 — 22:55

ИмяТаблчасти.ТекущиеДанные.ИмяКолонки

   Моха Лёхов

7 — 08.09.06 — 22:56

м.быть ИмяТаблчасти.ТекущиеДанные.ИмяКолонки.Значение, но скорее всего первый вариант

   milk it

8 — 08.09.06 — 22:58

ЭлементыФормы.ИмяТабличнойЧасти.ТекущиеДанные.ИмяРеквизита

вот так получилось

как то сложно вроде…

   Моха Лёхов

9 — 08.09.06 — 23:00

(8) Привыкай, это еще цветочки :). Но зато и вкусности есть.

   milk it

10 — 08.09.06 — 23:04

Спасибо :)

   andrey1111

11 — 08.09.06 — 23:31

и правильно, что представление от данных отделили. Мне нравится

   milk it

12 — 09.09.06 — 08:37

(8)

Все равно что то не так… А если у меня табличная часть на форме не размещена?

   Моха Лёхов

13 — 09.09.06 — 09:32

(12) А она все еще реквизит формы или таблчасть самого справочника? Разницу чуешь? ;)

   milk it

14 — 09.09.06 — 09:37

Она — табличная часть самого справочника. В данном случае табличное поле размещено на форме, поэтому (8) работает. А если бы я ее на форме не разместил?

   Tristan

15 — 09.09.06 — 09:40

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

   milk it

16 — 09.09.06 — 09:47

(15)

А, ну да, вообще то…

   Моха Лёхов

17 — 09.09.06 — 11:04

(14) Ну к табличной части справочника можно обращаться напрямую без «Элементы формы», но тогда, действительно, «текущая строка» — мистика.

   milk it

18 — 09.09.06 — 12:59

(17)

В этом случае надо обращаться к строке по индексу в [ ]

Так?

  

Моха Лёхов

19 — 09.09.06 — 13:39

(18) Вроде бы так, попробуй.

Котовчанин

942 / 482 / 200

Регистрация: 16.02.2010

Сообщений: 3,338

Записей в блоге: 37

1

Обращение к реквизиту ТЧ

23.03.2016, 14:46. Показов 25688. Ответов 8


Плаваю ещё в 1С программировании…
Как в модуле формы документа обратиться к реквизиту табличной части этого документа?



0



286 / 186 / 18

Регистрация: 20.02.2012

Сообщений: 925

23.03.2016, 14:57

2

для чего это необходимо? что делать будете с реквизитом тч?



1



GreenkA

Эксперт 1С

3051 / 1998 / 524

Регистрация: 25.06.2009

Сообщений: 6,964

23.03.2016, 16:17

3

Тамика, для изменения текущей строки

1C
1
2
ТекСтрока = Элементы[ИмяТабличнойЧасти].ТекущиеДанные;
ТекСтрока.Количество = 5;//где Количество - реквизит табличной части

для прохождения по всем строкам используйте цикл:

1C
1
2
3
Для Каждого ТекСтрока из Объект[ИмяТабличнойЧасти] Цикл
 ТекСтрока.Количество =5;
КонецЦикла;

для добавления новой строки:

1C
1
2
НовСтрока = Объект[ИмяТабличнойЧасти].Добавить();
НовСтрока.Количество =5;



1



Котовчанин

942 / 482 / 200

Регистрация: 16.02.2010

Сообщений: 3,338

Записей в блоге: 37

23.03.2016, 17:38

 [ТС]

4

GreenkO, прошу прощения, но у меня снова ступор. Сбросила конфигурацию(не знаю верно ли выгрузила…). Проблема с документом НачисленияЗарплат. В модуле объекта я сделала автоподстановку оклада по фамилии… То есть, при выборе фамилии поле СтавкаЗаМесяц должно заполнится само. А оно мало того, что не заполняется, так ещё отладчик показал, что даже не заходит в функцию ПриИзменении… Тестовая База 1.rar



0



Эксперт 1С

3051 / 1998 / 524

Регистрация: 25.06.2009

Сообщений: 6,964

23.03.2016, 18:43

5

Тамика, у меня проблемы при загрузке конфигурации из файлов. На Configuration.xml выдает несоответствие XDTO.
Можете выгрузить конфигурацию одним файлом(Конфигурация — Сохранить конфигурацию в файл)? Или базу(Администрирование — Выгрузить информационную базу).



0



Котовчанин

942 / 482 / 200

Регистрация: 16.02.2010

Сообщений: 3,338

Записей в блоге: 37

23.03.2016, 18:51

 [ТС]

6



0



Эксперт 1С

3051 / 1998 / 524

Регистрация: 25.06.2009

Сообщений: 6,964

23.03.2016, 18:57

7

Тамика, а можете перед выгрузкой установить режим совместимости? У вас платформа 8.3.7, у меня 8.3.6, не открывает. После выгрузки можно будет все вернуть.

Миниатюры

Обращение к реквизиту ТЧ
 



0



Котовчанин

942 / 482 / 200

Регистрация: 16.02.2010

Сообщений: 3,338

Записей в блоге: 37

23.03.2016, 19:52

 [ТС]

8

Поставила режим совместимости с 8.3.6. Или всё-таки лучше поставить с 8.3.4?



0



GreenkA

Эксперт 1С

3051 / 1998 / 524

Регистрация: 25.06.2009

Сообщений: 6,964

23.03.2016, 20:12

9

Лучший ответ Сообщение было отмечено Тамика как решение

Решение

Тамика, события элементов формы описываются &НаКлиенте(так было и по умолчанию, вы видимо изменили). Обращение к данным регистра сведений происходит &НаСервере, т.е. вам надо было вызвать функцию на сервере для получения ставки.
По работе с регистром сведений — есть такая функция ПолучитьПоследнее(…) — она сразу дает вам последнюю запись по регистру по заданному отбору.
Пользуйтесь синтакс-помощником, там так же описано, где можно вызывать определенные методы и получать свойства.

Измененный код:

1C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
&НаКлиенте
Процедура НачислениеЗарплатФИОПриИзменении(Элемент)
    ТекСтрока = Элемент.Родитель.ТекущиеДанные; //Элемент.Родитель = Табличная часть документа, получаем текущую строку 
    ТекСтрока.СтавкаЗаМесяц = ПолучитьСтавкуЗаМесяцНаСервере(ТекСтрока.ФИО);
КонецПроцедуры
 
&НаСервере
Функция  ПолучитьСтавкуЗаМесяцНаСервере(ФИО)
    Отбор = Новый Структура;
    Отбор.Вставить("Сотрудник", ФИО);
    ОкладыСотрудника = РегистрыСведений.ДанныеОСотрудниках.ПолучитьПоследнее(Объект.Дата, Отбор); 
    
    Если ОкладыСотрудника.Количество() = 0 Тогда
        Сообщить("Нет записей");
        Возврат 0;
    Иначе  
        Возврат ОкладыСотрудника.Оклад;
    КонецЕсли;
КонецФункции



1



  1. 05.04.2015, 14:28


    #1

    Сергей120 вне форума


    Гость форума


    По умолчанию Обращение к реквизиту табличной части другого документа

    Здравствуйте! У меня есть документ «ПервичныйЗавозТовара» с табличной частью «Товар» с реквизитами табличной части Наименование и Количество. Регистр накопления «КоличествоТовара»: измерение — «Наименование», ресурсы — «Количество». И документ «Продажа»,табличная часть «Товар», реквизиты «Наименование», «Количество» ,в котором я создал форму «ФормаДокумента1». (1С — Предприятие 8.2)

    В модуле формы в функции я создаю запрос на вытаскивание Наименования и Количества товаров из РегистраНакопления, мне нужно сравнивать Наименование товара который я выбрал для продажи в документе с наименованием товаров вытащенных из регистранакопления и если они совпадают, то возвращать в колонку «Количество» количество товаров на складе данного наименования. Как обратиться к реквизиту табличной части документа ПервичныйЗавозТовара?

    Код:

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


  2. 28.08.2015, 20:01


    #2

    ruha_tmz вне форума


    Гость форума


    По умолчанию Re: Обращение к реквизиту табличной части другого документа

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


  3. 31.08.2015, 10:19


    #3

    avm3110 вне форума


    Гордость форума PRO


    По умолчанию Re: Обращение к реквизиту табличной части другого документа

    В модуле формы в функции я создаю запрос на вытаскивание Наименования и Количества товаров из РегистраНакопления

    А зачем это делать (запрос поиска количества конкретного товара) в модуле формы? Делайте это в модуле объекта документа, а из модуля формы легко можно получить доступ к результирующей табличной части документа


ДокументыМенеджер

Объект ДокументыМенеджер позволяет получить доступ ко всем менеджерам документов. Это можно сделать перебрав все менеджеры в цикле или обратившись к конкретному менеджеру по имени. Также данный объект позволяет проверить является ли ссылка ссылкой на какой-нибудь документ:

//получение конкретного менеджера документа по имени
МенеджерДокаПриход = Документы.ПриходТовара;
МенеджерДокаРасход = Документы["РасходТовара"];

//перебор всех менеджеров документа
Для Каждого МенеджерДока Из Документы Цикл
	Сообщить(МенеджерДока);	
КонецЦикла;	

СсылкаНаЧтото = ПолучитьСсылкуНаЧтото();

//проверка является ли ссылка ссылкой на документ
ВсеДоки = Документы.ТипВсеСсылки();
Если ВсеДоки.СодержитТип(ТипЗнч(СсылкаНаЧтото)) Тогда
	//это ссылка на документ
Иначе
	//что-то другое
КонецЕсли;

Создание документа программно

Чтобы программно создать документ нужно использовать метод менеджера документа СоздатьДокумент:

//создаем новый документ
ПриходныйДок = Документы.ПриходТовара.СоздатьДокумент();
//обязательно заполняем дату
ПриходныйДок.Дата = ТекущаяДатаСеанса();
//... заполняем другие реквизиты
ПриходныйДок.Поставщик = СсылкаНаПоставщика;
//записываем в базу данных
ПриходныйДок.Записать();


Программное заполнение документа

Для программного заполнения документа нужно обращаться к каждому реквизиту объекта по имени, через точку от объекта:

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

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

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

//создаем новый документ
ПриходныйДок = Документы.ПриходТовара.СоздатьДокумент();
//добавим несколько строк в табличную часть СписокТоваров
НоваяСтрТЧ = ПриходныйДок.СписокТоваров.Добавить();
НоваяСтрТЧ.Товар = СсылкаНаТоварОдин;
НоваяСтрТЧ.Количество = 18;

НоваяСтрТЧ = ПриходныйДок.СписокТоваров.Добавить();
НоваяСтрТЧ.Товар = СсылкаНаТоварДва;
НоваяСтрТЧ.Количество = 36;

//можно загрузить строки из таблицы значений
//имена колонок должны совпадать с именами реквизитов табличной части
ПриходныйДок.СписокТоваров.Загрузить(НекаяТаблица);

//записываем в базу данных
ПриходныйДок.Записать();

Программное изменение документа

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

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


Программное копирование документа

Для создания копии объекта предназначен метод Скопировать. Данный метод есть как у ссылки на документ, так и у объекта:

//копия документа через ссылку
НоваяКопия = СсылкаНаДок.Скопировать();
НоваяКопия.Дата = ТекущаяДатаСеанса();
НоваяКопия.Записать();

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

Программное удаление документа

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

//устанавливать пометку на удаление можно только через объект
ПриходныйДок = СсылкаНаДок.ПолучитьОбъект();

//пометить на удаление
ПриходныйДок.УстановитьПометкуУдаления(Истина);

//снять пометку на удаление
ПриходныйДок.УстановитьПометкуУдаления(Ложь);

//удаление документа из базы
ПриходныйДок.Удалить();

Программное проведение документа

У документа нет отдельного метода для проведения документа. Проведение — это запись документа с проведением. Для проведения документа используется метод Записать, в который параметром нужно передать режим записи документа. Всего есть три режима записи: запись, проведение, отмена проведения. Если параметр не указан, то используется запись:

ПриходныйДок = Документы.ПриходТовара.СоздатьДокумент();
ПриходныйДок.Дата = ТекущаяДатаСеанса();

//запись документа
ПриходныйДок.Записать(РежимЗаписиДокумента.Запись);
//тоже запись
ПриходныйДок.Записать();

//проведение документа
ПриходныйДок.Записать(РежимЗаписиДокумента.Проведение);

//отмена проведения документа
ПриходныйДок.Записать(РежимЗаписиДокумента.ОтменаПроведения);

Программная работа с движениями документа

Через свойство Движения можно обращаться к движениям проведенного документа и даже редактировать их. Рассмотрим на примере:

ДатаПоиска = ТекущаяДатаСеанса();
ПриходныйДок = Документы.ПриходТовара.НайтиПоНомеру("АА0000003", ДатаПоиска);

ДокПриходОбъект = ПриходныйДок.ПолучитьОбъект();
//получаем все движения документа
ДвиженияДока = ДокПриходОбъект.Движения;

//перебор всех регистров, по которым выполняются движения документом
Для Каждого Рег Из ДвиженияДока Цикл
	Сообщить(Рег);
КонецЦикла;	

//количество регистров из коллекции движений
КолвоРег = ДвиженияДока.Количество(); 

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

Программный поиск документа

Чтобы программно найти документ можно использовать методы НайтиПоНомеру и НайтиПоРеквизиту менеджера документа.

НайтиПоНомеру

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

ДатаПоиска = Дата(2021,1,1);
//в настройках нумерации указана Периодичность = В пределах года
ПриходныйДок = Документы.ПриходТовара.НайтиПоНомеру("000000017", ДатаПоиска);
//поиск будет выполняться среди документов за 2021 год с номером 000000017

//в настройках нумерации указана Периодичность = В пределах месяца
ПриходныйДок= Документы.ПриходТовара.НайтиПоНомеру("000000017", ДатаПоиска);
//поиск будет выполняться среди документов за январь 2021 год с номером 000000017

//в настройках нумерации указана Периодичность = Непериодический
//дату можно не указывать
ПриходныйДок = Документы.ПриходТовара.НайтиПоНомеру("000000017");
//поиск будет выполняться среди всех документов

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

НайтиПоРеквизиту

Метод НайтиПоРеквизиту принимает два параметра: имя реквизита и значение реквизита. Если реквизит имеет тип Строка, то поиск выполняется по точному соответствию. Нельзя искать по реквизиту с типом ХранилищеЗначения или неограниченная строка.

//поиск по реквизиту
//первый параметр - имя реквизита
//второй параметр - значение реквизита
ПриходныйДок = Документы.ПриходТовара.НайтиПоРеквизиту("Поставщик", СсылкаНаПоставщика);

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

Выборка документов

Чтобы получить выборку документов можно воспользоваться методом Выбрать менеджера документа. Затем полученную выборку можно перебрать с помощью цикла Пока. На каждом витке цикла будут данные об одном документе. Через параметры метода можно ограничить выборку по периоду или по реквизитам.

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

//выборка документов за 2 месяца
ВыборкаПриходов = Документы.ПриходТовара.Выбрать(Дата(2021,1,1), Дата(2021,2,28));

//выборка всех документов, у которых дата больше 1 марта 2021
ВыборкаПриходов = Документы.ПриходТовара.Выбрать(Дата(2021,3,1));

//выборка всех документов, у которых дата меньше 15 марта 2021
ВыборкаПриходов = Документы.ПриходТовара.Выбрать(, Дата(2021,3,15));

//выборка документов с конкретной датой 
ОтборДок = Новый Структура("Дата", Дата(2021,3,22));
ВыборкаПриходов = Документы.ПриходТовара.Выбрать(,, ОтборДок);

//выборка документов с конкретным значением реквизита 
ОтборДок = Новый Структура("Поставщик", СсылкаНаПоставщика);
ВыборкаПриходов = Документы.ПриходТовара.Выбрать(,, ОтборДок);

//выборка отсортированная по убыванию даты
ВыборкаПриходов = Документы.ПриходТовара.Выбрать(,,, "Дата Убыв");

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

Программная работа с ссылкой на документ

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

Поставщик = СсылкаНаДокПриход.Поставщик;
ДатаДок = СсылкаНаДокПриход.Дата;
//однако на клиенте такой код не сработает с ошибкой:
// поле объекта не обнаружено

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

//получение пустой ссылки на документ
ПустойДокПриход = Документы.ПриходТовара.ПустаяСсылка();

//проверка на пустую ссылку
Если ПустойДокПриход.Пустая() Тогда
	//пустая ссылка
КонецЕсли;	
//или так
Если ПустойДокПриход = Документы.ПриходТовара.ПустаяСсылка() Тогда
	//тоже пустая ссылка
КонецЕсли;

Сопоставление документов по идентификатору

У каждого документа есть уникальный идентификатор, который присваивается при первой записи документа и не может быть изменен. Часто при обмене между двумя базами данных требуется сопоставлять документы. Для этого можно использовать идентификаторы.

Пример выгрузки идентификатора документа. Уникальный идентификатор получается из ссылки методом УникальныйИдентификатор:

ВыборкаПриходов = Документы.ПриходТовара.Выбрать();
Пока ВыборкаПриходов.Следующий() Цикл
	//получаем уникальный идентификатор
	УИДПрихода = ВыборкаПриходов.Ссылка.УникальныйИдентификатор();
	//преобразуем в строку
	УИДПриходаСтрокой = Строка(УИДПрихода);
	//дальше записываем строку в файл обмена
КонецЦикла;	

Пример сопоставления документов по идентификатору. Здесь используется метод ПолучитьСсылку для получения ссылки на документ по уникальному идентификатору и метод УстановитьСсылкуНового чтобы уникальный идентификатор нового документа был равен уникальному идентификатору, полученному из другой базы.

//ТаблицаЗагрузки - некая таблица с данными из другой базы
Для Каждого Стр ИЗ ТаблицаЗагрузки Цикл
	УИДПриходаСтрокой = Стр.УИД;
	//создаем уникальный идентификатор
	УИДПрихода = Новый УникальныйИдентификатор(УИДПриходаСтрокой);
	
	//получаем ссылку на документ
	ПриходныйДок = Документы.ПриходТовара.ПолучитьСсылку(УИДПрихода);
	//из ссылки получаем объект
	ДокПриходОбъект = ПриходныйДок.ПолучитьОбъект();
	Если ДокПриходОбъект = Неопределено Тогда
		//если объект = Неопределено значит документа с таким
		//идентификатором еще нет, создаем его
		ДокПриходОбъект = Документы.ПриходТовара.СоздатьДокумент();
		//...заполнение
		
		//до записи обязательно устанавливаем полученную ссылку 
		//тогда идентификаторы будут совпадать
		ДокПриходОбъект.УстановитьСсылкуНового(ПриходныйДок);
		ДокПриходОбъект.Записать();
	Иначе
		//уже есть документ с таким идентификатором,
		//перезаписываем его
	КонецЕсли;	
КонецЦикла;	

Смотрите также:
Электронный учебник по программированию в 1С
Рекомендации по изучению программирования 1С с нуля
Игра «Кто хочет стать миллионером?» с вопросами на определенную тематику (язык программирования JavaScript, английские, немецкие, французские, испанские, португальские, ни­дер­ландские, итальянские слова, электробезопасность, промышленная безопасность, бокс и т.п.), написанная на 1С
Программирование в 1С 8.3 с нуля — краткий самоучитель
Комплексная подготовка программистов 1С:Предприятие 8.2
Сайты с уроками программирования и со справочниками
Youtube-каналы с уроками программирования
Сайты для обучения программированию
Лекции и уроки

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

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

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

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

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

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

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

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

КонецЦикла;

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

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

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

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

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

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

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

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

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

КонецЦикла;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

 Как получить доступ к реквизитам формы?

Если реквизит объекта «вытащен» на форму, то реквизит формы можно получить через объект ЭлементыФормы, который содержит коллекцию элементов формы, сканируя ее в цикле:

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

Этот цикл позволяет просмотреть имена а так же типы всех реквизитов формы, в том числе такие реквизиты как надписи, командные панели и тд.

Реквизиты формы могут быть различных типов. Поставив фильтр в виде типа реквизита мы можем просмотреть реквизиты определенного типа.

Если реквизит формы имеет тип «ТабличноеПоле», то можно такой элемент просканировать во вложенном цикле и узнать имена колонок таблицы:

 
Для Каждого Элемент Из ФормаОбъекта.ЭлементыФормы Цикл
        Сообщить(Элемент.Имя);
        Если Тип(Элемент) = Тип("ТабличноеПоле") Тогда
                Сообщить(" Это табличное поле! "  + Элемент.Имя );
                Для Каждого Колонка Из Элемент.Колонки Цикл
                        ИмяКолонки = Колонка.Имя;
                        Сообщить(ИмяКолонки);
                КонецЦикла;
        КонецЕсли;      
КонецЦикла;     
 

Как получить значение отдельного реквизита формы?

Чаще требуется получать не массив реквизитов формы,  а значение отдельных конкретных реквизитов формы. Например реквизиты «Шапки» или «Подвала» формы документа.

Пример:

 
ФормаОбъекта = ДокОбъект.ПолучитьФорму("ФормаДокумента");
Поставщик = ФормаОбъекта.ЭлементыФормы.Поставщик;
Поставщик = ФормаОбъекта.ЭлементыФормы.Получатель;
Сообщить(ФормаОбъекта.ЭлементыФормы.ТаблПоле.Колонки.Количество());
 

Реквизиты шапки могут иметь различные типы: Дата, СправочникСсылка, ЧекБокс, элемент раскрывающегося списка и др.

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

Доступ к табличной части формы через объект

Доступ к табличной части формы (например: Товары) можно получить через объект:

 
  ДокОбъект = Док.ПолучитьОбъект(); //здесь Док - ссылка на объект
  //просканируем построчно таб часть документа
  Для Каждого Стр из ДокОбъект.Товары Цикл
      Номенклатура = Стр.Номенклатура;
      Стр.Коэффициент = 1;
  КонецЦикла;
 

Здесь ДокОбъект.Товары — это табличная часть «Товары» объекта. Далее в цикле табличная часть построчно сканируется!
В каждой итерации цикла можно получить доступ к любому полю строки указав через точку имя этого поля:

      Номенклатура = Стр.Номенклатура;

Доступ к табличной части формы через ЭлементыФормы

Табличная часть объекта и табличная часть формы объекта — это не одно и то же!

Для того, чтобы код работал правильно, надо чтобы колонка формы табчасти объекта в свойстве данные ссылалась на реквизит табличной части объекта. Этим определяется тип колонки таб части формы.

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

Объект ЭлементыФормы используется для доступа к элементам управления, расположенным на форме, в частности к таб части документа.

 
        ДокСсылка = СсылкаНаДокумент(ТипДокумента, НомерДок);
        ДокОбъект = ДокСсылка.ПолучитьОбъект();
                                
        ФормаОбъекта = ДокОбъект.ПолучитьФорму();
        Для Каждого Элемент Из ФормаОбъекта.ЭлементыФормы Цикл
                Если Тип(Элемент) = Тип("ТабличноеПоле") Тогда //элемент формы - табличное поле
                                                        
                        Если Элемент.Имя = "Товары" Тогда
                                Сообщить("Это табличное поле!! "  + Элемент.Имя );
                                
                                //ТабПоле = ФормаОбъекта.ЭлементыФормы.Товары.Значение;
                                ТабПоле = Элемент.Значение;
                                Колво = ТабПоле.Количество();
                                Сообщить("Количество строк: " + Колво); 
                                
                                Для Каждого ТекущаяСтрока Из ТабПоле Цикл
                                        
                                        Имя = ТекущаяСтрока.Номенклатура;
                                        Сообщить(Имя); 
                
                                КонецЦикла;                             
                                
                        КонецЕсли;      
                                                        
                КонецЕсли;                                      
        КонецЦикла;  
 

Результат для документа Авансовый отчет:

Это табличное поле!! Товары
Количество строк: 4
Женские ботфорты коричневые
Ботинки женские демисезонные
Ботинки женские натуральная кожа
Женские босоножки       

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

 
        ДокСсылка = СсылкаНаДокумент(ТипДокумента, НомерДок);
        ДокОбъект = ДокСсылка.ПолучитьОбъект();
                                
        ФормаОбъекта = ДокОбъект.ПолучитьФорму("ФормаДокумента");
        Для Каждого Элемент Из ФормаОбъекта.ЭлементыФормы Цикл
                Если Тип(Элемент) = Тип("ТабличноеПоле") Тогда
                                                        
                        Если Элемент.Имя = "ВыданныеАвансы" Тогда //таб часть объекта
                                Сообщить(" Это табличное поле!! "  + Элемент.Имя );
                                
                                ТабПоле = Элемент.Значение;
                                Индекс = 0;
                                Для Каждого ТекущаяСтрока Из ТабПоле Цикл
                                        
                                        Сообщить("=======================");
                                        Для Каждого Колонка Из Элемент.Колонки Цикл
                                                
                                                ИмяКолонки = Строка(Колонка.Имя);
                                                Сообщить(ИмяКолонки);
                                                Имя = ТекущаяСтрока[ИмяКолонки];//сработает только если есть такое поле таб части объекта
                                                Сообщить("=== " + Имя); 
                                                
                                        КонецЦикла;
                                        
                                        Индекс = Индекс + 1;
                                        Если Индекс > 0 Тогда break КонецЕсли; //только первая строка
                                        
                                        
                                КонецЦикла;                             
                                
                                                        
                        КонецЕсли;      
                                                        
                КонецЕсли;                                      
        КонецЦикла;    
 

Результат для документа Авансовый отчет:

Это табличное поле!! ВыданныеАвансы
=======================
НомерСтроки 1
ДокументАванса Расходный кассовый ордер ТК000000004 от 15.02.2007 19:24:03
СуммаДокументаАванса 300
ВалютаДокументаАванса USD
Выдано 300
Сумма 174

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

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


Posted: 19 июля, 2012 in 1 с предприятие 8.2

Нужно чтобы при выборе номенклатуры устанавливалась базовая единица  по умолчании из справочника номенклатуры(Уп, Шт), но при желании в документе эту единицу можно было бы изменить.

Если бы менять не надо то просто перетаскиваем поле БазоваяЕдиница из Объекта в элементы табличной части.

ИНаче создаем реквизит в табличной части документа,  с типом Справочника в котором эти единицы хранятся.

Для поля номенклатура, выбираем событие  «При изменении»

И дописываем код:

&НаКлиенте
Процедура ТоварыНоменклатураПриИзменении(Элемент)
Тд=Элементы.Товары.ТекущиеДанные;
Тд.БазоваяЕдиницаИЗБазы=ПолучитьДанные(Тд.Номенклатура);
КонецПроцедуры

&НаСервере
Функция ПолучитьДанные(Ссылка)

Возврат(ссылка.БазоваяЕдиница);
КонецФункции // ПолучитьДанные()

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

Понравилась статья? Поделить с друзьями:

Другие крутые статьи на нашем сайте:

0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии