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

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

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

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

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

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

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

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

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

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

1. Создание внешней обработки

Создаем внешнюю обработку. В модуле внешней обработки создаем экспортную процедуру «СведенияОВнешнейОбработке». В параметр «Вид» устанавливаем значение «ЗаполнениеОбъекта», настройку команды «Использование» устанавливаем «ОткрытиеФормы».

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

Читайте также:  Feature not found h0031

2. Описание модуля формы

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

Ссылку на документ можно получить из параметра формы «ОбъектыНазначения». Этот параметр доступен внешним обработкам в режиме «ОткрытиеФормы». Параметр «ОбъектыНазначения» представляет собой массив ссылок выбранных документов. В нашем случае мы будем запускать обработку только из формы документа, следовательно, массив объектов назначения будет содержать только один элемент с индексом 0.

Мы описали заполнение формы исходными данными и переходим к описанию функционала изменения значений табличной части. На данном этапе мы реализуем задачу нашей обработки. Здесь можно изменить количество, цену, ставку налога и т.д. Не забываем, что состав колонок реквизита формы Товары тоже должен соответствовать поставленной задаче. Я выбрал самый простой вариант – изменение цены.

3. Перенос изменений в документ

Переходим к завершающему этапу – перенос изменений в документ. Вот на этом этапе и возникает вопрос: «Как это сделать?». Традиционно перенос данных в документ осуществляется механизмом оповещений, но в нашем случае конфигурация полностью на поддержке с запретом изменений, и нет возможности обработать нетиповую ситуацию. Для решения этой задачи используем свойство управляемой формы «ВладелецФормы». Владельцем формы является форма нашего документа и устанавливается системой автоматически в режиме «ОткрытиеФормы». Через свойство владелец формы может получить доступ к ее основному реквизиту «Объект», в состав которого входит коллекция строк табличной части «Товары». Важно помнить, что свойство «ВладелецФормы» всегда доступно на клиенте открытой формы.

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

Читайте также:  Лучшие фляги для воды

Если мы меняем какое-либо числовое значение, то чаще всего необходимо выполнить пересчет связанных значений в строке. Например, изменяя цену необходимо пересчитать сумму, сумму НДС и что-то еще. Для этого лучше использовать типовые процедуры пересчета табличной части. Перенесем из документа в нашу форму типовой обработчик события изменения цены – «ТоварыЦенаПриИзменении».

В данном примере мы использовали метод поиска строки по реквизиту «НомерСтроки». Но может возникнуть ситуация, когда в процессе выполнения обработки пользователь случайно изменит порядок строк в документе, тем самым нарушив соответствие строк табличной части документа номеру строк таблицы формы нашей обработки. Для обеспечения гарантированного соответствия заблокируем окно документа на время проведения изменений. Для этого в форме обработки установим для свойства «РежимОткрытияОкна» значение «Блокировать окно владельца».

1С-Предприятие 8.3. Попытался изменить значения столбца "Ставка НДС" в таблице "Номенклатура" на "Без НДС", за неимением группировок и работой со всем столбцом решил написать скрипт, значение столбца получить удалось, да и количество записей + значение, которое записать нужно, но столкнулся со следующим: функция Записать(); ругается на отсутствие метода или что-то такое.

Вот листинг:
Процедура УстановитьНаСервере()
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| Номенклатура.СтавкаНДС КАК СтавкаНДС1,
| Номенклатура.СтавкаНДС.Ссылка,
| Номенклатура.СтавкаНДС.Порядок
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ДЛЯ ИЗМЕНЕНИЯ";

Выборка=Запрос.Выполнить().Выгрузить();
//ТекЗапись = Справочник.Номенклатура.СоздатьМенеджерЗаписи();

Для каждого Строка из Выборка Цикл
Документ = Строка;
Документ.СтавкаНДС1 = Перечисления.СтавкиНДС.БезНДС;
Сообщить(Документ.СтавкаНДС1);
Записать();
КонецЦикла;

и скрины:

Каким образом обновить/сохранить/записать эту несчастную "Без НДС" во все поля столбца ?
До этого никогда не работал с 1С и документации адекватной найти не получилось

  • Вопрос задан более трёх лет назад
  • 1364 просмотра

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

Читайте также:  Blu ray проигрыватель что это такое

Путь программиста. Нужно запросом отобрать не свойства ставки НДС из справочника номенклатуры, а ссылки на элементы справочника (с отбором на то, что это не группа). Далее по выборке из запроса по ссылке получаете объект, заменяете ставку НДС и записываете назад в базу. Выглядит примерно так:

А что написали Вы?
Вы отбираете свойства номенклатуры (скорее всего они у всех одинаковые = 18%) и далее работаете с массивом идентичной информации. Поскольку в вашей переменной Выборка находится ТаблицаЗначений, то значения поля СтавкаНДС1 вам с легкостью удается переопределить (бессмысленное занятие с учетом того, что после выполнения процедуры эта таблица будет удалена из памяти).
Далее вызываете метод контекста Записать() – который определен внутри модуля объекта и модуля формы элемента для объектов данных. В случае работы внутри формы элемента справочника номенклатуры вам бы удалось записать текущий элемент, но вы скорее всего работаете в обработке и в ее контексте этого метода по-умолчанию нет – поэтому получаете ошибку.

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Adblock detector