Lyrium
@Lyrium
Web developer

1C как изменить все значения одного столбца в таблице «Номенклатура»?

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

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

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

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

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

и скрины:
5ac009686c8e4600b8f1d4be002792e4.jpg3dfc3065519a491095e454f24e924dd2.jpg

Каким образом обновить/сохранить/записать эту несчастную "Без НДС" во все поля столбца ?
До этого никогда не работал с 1С и документации адекватной найти не получилось
  • Вопрос задан
  • 3699 просмотров
Решения вопроса 1
@Dementor
программист, архитектор, аналитик
Быстрое решение. Запустите групповую обработку справочников и документов (обработка, которая есть во всех типовых конфигурациях и в обычном и в управляемом вариантах интерфейсов), выберите тип справочник номенклатура, наложите при необходимости отбор и изменяйте значение реквизита для всех элементов.

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


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

Представьте, что у Вас есть две таблицы:
1. Человек[Id, Имя, Пол] - здесь поле "Пол" - это Foreign Key на таблицу полов #2
2. Пол[id, Имя]

Стоит задача перезаписать пол человека. Вы у себя просто перебираетe элементы таблицы "Пол" безотносительно к нужным Вам элементам таблицы "Человек".

Ну и дальше Дмитрий уже рассказал.

Т.е. нужно отталкиваться от того, что вам нужно перезаписать элемент сущности "Cправочник.Номенклатура", соответственно и ссылку нужно на нее выбирать и работать с ней.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы