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

В предыдущей статье мы узнали, как настраивать и конфигурировать табличные части объектов 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

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

Получаем объект, табличную часть которого надо изменить. Используем метод ПолучитьОбъект().

Итак, у нас есть табличная часть и есть метод Найти(), который возвращает строку табличной части. Однако при попытке присвоить полю найденной строки какого-либо значения, система выдаёт ошибку.

Выход: изменять строки табличной части в цикле.

Допустим, табличная часть называется «Товары». Она имеет две колонки: «Номенклатура» и «Артикул».

Обходим строки табличной части в цикле и изменяем то, что нам нужно.

Для Каждого СтрокаТабличнойЧасти Из Товары Цикл

	Если СтрокаТабличнойЧасти.Артикул = "0001" Тогда
	
		СтрокаТабличнойЧасти.Артикул = "0123";
		
	КонецЕсли;
	
КонецЦикла; 
Информация о материале
Категория: Программирование 1С

Опубликовано: 20 апреля 2016

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

Я
   alex2808

19.02.09 — 16:14

Есть ссылка на документ.

Нужно зайти в его табличную часть Товары.

Найти в ней

1) Номенклатура-1

2) Номенклатура-2

3) Номенклатура-3

И в них поменять количество товара.

Подскажите как это сделать?

Пробовал так

Док = БазовоеПеремещение.ПолучитьОбъект(); //ссылка на документ

Пока НоваяСтрокаВозврата.Следующий() Цикл

Док.Товары.НайтиСтроки(Новый Структура(«Номенклатура»,НоваяСтрокаВозврата.Номенклатура));

Если Строка.Количество()<=0 Тогда

  Сообщить(НоваяСтрокаВозврата.Номенклатура+» не найдена!!!»);

Иначе

 Строка[0].Количество = Строка[0].Количество — НоваяСтрокаВозврата.Количество;

КонецЕсли;

КонецЦикла;

Док.Записать();

Не получается.

Что неправильно?

   Stepa86

1 — 19.02.09 — 16:17

переменная строка это что?

   tsr

2 — 19.02.09 — 16:17

Это откуда?
Если Строка.Количество()<=0 Тогда
  Сообщить(НоваяСтрокаВозврата.Номенклатура+» не найдена!!!»);
Иначе
 Строка[0].Количество = Строка[0].Количество — НоваяСтрокаВозврата.Количество;
КонецЕсли;

Тогда уж
строка=Док.Товары.НайтиСтроки(Новый Структура(«Номенклатура»,НоваяСтрокаВозврата.Номенклатура));

   alex2808

3 — 19.02.09 — 16:17

Извиняюсь
Строка = Док.Товары.НайтиСтроки(Новый Структура(«Номенклатура»,НоваяСтрокаВозврата.Номенклатура));

   Stepa86

4 — 19.02.09 — 16:18

на вскидку как то так:

Док = БазовоеПеремещение.ПолучитьОбъект(); //ссылка на документ

Пока НоваяСтрокаВозврата.Следующий() Цикл

МассивСтрок = Док.Товары.НайтиСтроки(Новый Структура(«Номенклатура»,НоваяСтрокаВозврата.Номенклатура));

Для Каждого цСтрока Из МассивСтрок Цикл

цСтрока.Количество = цСтрока.Количество — НоваяСтрокаВозврата.Количество;

КонецЦикла;

Док.Записать();

   alex2808

5 — 19.02.09 — 16:23

По идее этот код ведь тоже рабочий, если мне нужна только 1-я строка из найденного массива?!

Док = БазовоеПеремещение.ПолучитьОбъект(); //ссылка на документ

Пока НоваяСтрокаВозврата.Следующий() Цикл
Строка = Док.Товары.НайтиСтроки(Новый Структура(«Номенклатура»,НоваяСтрокаВозврата.Номенклатура));
Если Строка.Количество()<=0 Тогда
  Сообщить(НоваяСтрокаВозврата.Номенклатура+» не найдена!!!»);
Иначе
 Строка[0].Количество = Строка[0].Количество — НоваяСтрокаВозврата.Количество;
КонецЕсли;
КонецЦикла;
Док.Записать();

   butterbean

6 — 19.02.09 — 16:25

(5) зачем тогда НайтиСтроки, можно просто Найти

   tsr

7 — 19.02.09 — 16:25

Зачем тогда ищешь массив строк? Ищи одну. А лучше посмотри отладчиком где косяк

   alex2808

8 — 19.02.09 — 16:32

(6)
Блин а ведь точно! :)
Так правильно?  

Док = БазовоеПеремещение.ПолучитьОбъект(); //ссылка на документ

Пока НоваяСтрокаВозврата.Следующий() Цикл
Строка = Док.Товары.Найти(НоваяСтрокаВозврата.Номенклатура,»Номенклатура»);
Если Строка = Неопределено Тогда
  Сообщить(НоваяСтрокаВозврата.Номенклатура+» не найдена!!!»);
Иначе
 Строка.Количество = Строка.Количество — НоваяСтрокаВозврата.Количество;
КонецЕсли;
КонецЦикла;
Док.Записать();

   alex2808

9 — 19.02.09 — 16:34

Тут вопрос в ньюансе, Док можно сохранять после цикла, когда
были изменены множество строк?

Или Док.Записать() надо делать после изменения каждой строки?

   Stepa86

10 — 19.02.09 — 16:36

(9) фигасе ньюанс — если не учитывать тормоза во втором случае, то без разницы =)

  

svent0vit

11 — 19.02.09 — 17:33

(9), будешь писать в цикле — будут тормоза. Сделай флаг «Записать»:

Записать = Ложь;

Если Строка = Неопределено Тогда

  Сообщить(НоваяСтрокаВозврата.Номенклатура+» не найдена!!!»);

Иначе

 Строка.Количество = Строка.Количество — НоваяСтрокаВозврата.Количество;

 Записать = Истина;

КонецЕсли;

КонецЦикла;

Если Записать Тогда Док.Записать();

Содержание:

1.   Изменения в табличной части Товары

Достаточно часто возникает ситуация, когда появляется потребность внести изменения в табличную часть Товары документов Заказ клиента и документа Реализация товаров и услуг:

·         добавить товары из других документов

·         изменить цены на процент

·         установить тип цены по виду цен

·         установить новую ставку НДС

·         установить размер скидки

Обработка «Обработка табличной части Товары» в 1С 8 Управление торговлей 11 предназначена для внесения изменений в табличную часть документов Заказ клиента и Реализация товаров и услуг.

Документ Заказ клиента в 1С 8 УТ 11   

2.   Использование Обработки табличной части Товары

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

Обработка табличной части Товары

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

Выбор типа документа в 1С 8 УТ 11

Номенклатура из выбранных документов в окне с исходной номенклатурой в 1С 8 УТ 11

·         «Изменить цены на %»

Установка % ставки в 1С 8 УТ 11


 

Изменение цены на % в колонке «Цена» в 1С 8 УТ 11

·         «Установить цены по типу» (в соответствии с заданными видами цен)

Установка цены по Виду цен в 1С 8 УТ 11

Установить тип цен в одноименной колонке, с заполнением соответствующей цены по товару, в колонке «Цена»

Вид цены в 1С 8 УТ 11

·         «Установить ставку НДС», выбрав ее из соответствующего справочника для установленной Ставки НДС.

Установка ставки НДС в 1С 8 УТ 11

Установка выбранной Ставки НДС производится в одноименной колонке, с заполнением/пересчетом соответствующих сумм НДС по товару, в колонках «Сумма НДС» и «Сумма с НДС».

Ставка НДС в 1С 8 УТ 11

·         «Установить скидку»

Установка скидки в 1С 8 УТ 11

Установка указанного процента Скидки производится в колонке «% руч.» с заполнением/пересчетом соответствующей суммы, в колонке «Сумма руч.».

Установка процента скидки в 1С 8 УТ 11

Выполняется любое выбранное действие в 1С 8.3 УТ 11 после нажатия кнопки «Выполнить», только по выбранной номенклатуре, с установленным признаком в колонке Пометка.

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

Сохраняем табличную часть при изменении и можем закрывать обработку в 1С 8.3 Управление торговлей 11 и переносить в документ отредактированную табличную часть нажатием кнопки «ОК».

Специалист компании «Кодерлайн»

Владимир Бахтин

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

А если быть точней то изменить дату у записей в табличной части, но по аналогии можно изменить все что угодно.

Как изменить дату в ТЧ у всех записей

И так допустим у на есть какой-то документ, у него есть табличная часть, в которой нужно что-то изменить, например, установить одну и туже дату, которую пользователь сам укажет.

Изменение ТЧ

Для этого нужно открываем конфиггуратор, найти документ, создать в нем команду «Изменить дату», открыть свойства данного элемента и перейти а Действие.

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

В открывшемся модуле пишем следующий код.

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

УстановкаДаты = «»; — задаем пустое значение для переменной в которой будет храниться дата.

Результат = ВвестиДату(УстановкаДаты, «Введите дату», ЧастиДаты.Дата); — открываем форму ввода даты и сохраняем её в переменную УстановкаДаты.

И в цикле перебираем строки и записываем дату.

Как изменить дату в ТЧ у всех записей

Сохраняем и запускаем программу. Открываем документ в который вносили изменения, теперь на форме появилась кнопка «Изменить дату», которая открывает окно в котором можно выбрать дату.

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

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

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

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

Если возникли трудности то пишите в комментариях обязательно помогу.

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

Не пропустите также:

  • Сразу как нашел запятая
  • Как исправить ошибку ваше соединение не защищено в браузере яндекс
  • Как найти сиды для торрента
  • Тень на экране телевизора как исправить
  • Как найти самые продаваемые товары на вайлдберриз

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

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