Имя: Пароль:
1C
1С v8
Подскажите Студенту. Изменение цены. Номенклатура
0 Muaviya
 
21.06.20
10:09
Задание

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

Как я понимаю надо решить задачу
в обработке
1. Создать кнопку "изменить на 10 000"
2. Создать Кнопку "Выберите наименование"
3. При выборе наименования выбирается товар и при нажатии на кнопку "10 000" его цена в документе "УстановкаЦенНоменклатуры" меняется на 10 000


Возникшие проблемы.
1. Создаю кнопку "Выберите наименование".
Создаю ее согласно условиям задачи в форме обработки. Если выбираю "ДокументСсылка.УстановкаЦенНоменклатуры" то при нажатии выбираются только документы без возможности выбора товара

Если создаю ее "СправочникиСсылка.Номенклатура" То товар выбирается. Но мне не понятно как в таком случае взять наименование из справочника номенклатура проверить его есть ли оно в документе УстановкаЦенНоменклатуры и если есть то присвоить ему значение цены в 10 000.
Такое вообще в 1С возможно ? Или это бред ?

Помогите пожалуйста справиться с задачкой.


Из того что я смог сделать

Меняю ВСЕ товары на 10 000 следующим кодом.


&НаСервере
Процедура УстановкаЦеныНаСервере()
Выборка = Документы.УстановкаЦенНоменклатуры.Выбрать();

Пока Выборка.Следующий() Цикл;
НЦ = Выборка.ПолучитьОбъект();

Для Каждого ТекСтр ИЗ НЦ.Данные Цикл
ТекСтр.Цена = 10000;
КонецЦикла;

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

КонецЦикла;

КонецПроцедуры
1 Timon1405
 
21.06.20
10:15
Ребят, я начинающих хирург, выдали разрезанный апельсин, сказали сшить обратно чтобы не гнилой был. он лежит на столе, я его выбрал на столе, взять его в руки или так пробовать шить? можно использовать швейную машинку? какую иглу посоветуете? пока вроде сшил, но косточки снаружи остались, это нормально?
2 Галахад
 
гуру
21.06.20
10:31
Для Каждого ТекСтр ИЗ НЦ.Данные Цикл
Если ТекСтр.Номенклатура = ТотСамыйРеквизитНаФормеСТипомНоменклатура Тогда
ТекСтр.Цена = 10000;
КонецЕсли;
КонецЦикла;
3 Галахад
 
гуру
21.06.20
10:32
(1) Зря ты так. Чел потрудился и описал задачу.
4 hhhh
 
21.06.20
13:11
(0) наименования нахрен никогда никому не нужны. Работай с самими товарами.

Кнопка 2. Создать Кнопку "Выберите товар"
5 Ёпрст
 
21.06.20
17:36
(0)

1.кидаешь на форму реквизит диалога, ставишь ему тип Справочник.Номенклатура, идентификатор назначаешь ему Валенки, например.
2.создаешь команду формы, УстановитьЦенуВаленкам, при создании ставишь переключатель создать процу на клиенте и на сервере
3. создаешь кнопку, назначаешь ей команду УстановитьЦенуВаленкам (или просто команду установить ценуВаленкам тащишь на форму, оно само кнопкой станет)
4.создаешь реквизит формы с типом чиисло 15.2, называешь его Цена

далее в модуле пишешь
&НаКлиенте
Процедура УстановитьЦенуВаленкам()
6 Krendel
 
21.06.20
17:39
(0) Это регистр сведений, менять во всех документах цену это методологически не правильно!

Достаточно сгенерировать документ установка цен номенклатуры на дату изменения цены
7 Krendel
 
21.06.20
17:39
если мы говорим про типовые конфигурации

Как у вас там в ЗУПе реализовано, я хз
8 Ёпрст
 
21.06.20
17:47
&НаКлиенте
Процедура УстановитьЦенуВаленкам()
  УстановитьЦенуВаленкамНаСервере()
КонецПроцедуры
&НаСервере
Процедура УстановитьЦенуВаленкамНаСервере()
    Запрос = Новый Запрос("ВЫБРАТЬ
    |УстановкаЦенНоменклатурыТовары.Ссылка КАК Ссылка,
    |УстановкаЦенНоменклатурыТовары.НомерСтроки-1 КАК НомерСтроки
|ИЗ
|    Документ.УстановкаЦенНоменклатуры.Товары КАК УстановкаЦенНоменклатурыТовары
|ГДЕ
|    УстановкаЦенНоменклатурыТовары.Номенклатура = &Номенклатура И УстановкаЦенНоменклатурыТовары.Цена<>&Цена
|ИТОГИ ПО
    Ссылка"     ) ;

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

Наслаждаешься, кушаешь печенки..
9 Muaviya
 
21.06.20
20:37
Спасибо всем за помощь !

Спасибо за подсказку Галахад. По его подсказке создал вот такой код

Код и рекомендации которые написал  Ёпрст увидел уже после решения. Но написал он код интересный буду его тестить.

&НаСервере
Процедура Цена15000НаСервере()
    
Выборка = Документы.УстановкаЦенНоменклатуры.Выбрать();

Пока Выборка.Следующий() Цикл;
НЦ = Выборка.ПолучитьОбъект();

Для Каждого ТекСтр ИЗ НЦ.Данные Цикл
Если ТекСтр.Номенклатура = ВыберитеТовар Тогда

ТекСтр.Цена = 15000;
КонецЕсли;
КонецЦикла;

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

КонецЦикла;
Сообщить("Что бы увидеть изменения необходимо перезагрузить клиент");
    
КонецПроцедуры

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

Создана команда (цена 15000) она же является и кнопкой
Создан реквизит (ВыбиретеТовар) он тоже является кнопкой
ВыберитеТовар имеет тип СправочникСсылка.Номенклатура

Тыкаем на ВыберитеТовар выбираем из списка номенклатуры товар например Сахар
Тыкаем на кнопку "Цена 15000" и в документе "УстановкаЦенНоменклатуры значение цены сахара меняется на 15 000.

Осталось одно НО !
Для того что бы увидеть изменения надо перезагрузить клиент (закрыть и открыть снова)

Почему так я не знаю.

Вопрос преподу задам. Но обучаюсь дистанционно. Ответит, не ответит - увидим


И еще вопрос.
Как вставлять код на форуме как это сделал Ёпрст ?
10 Muaviya
 
21.06.20
20:38
Прикольно получилось даже обрабатывать ничего не пришлось. Код сам вставился красиво !!!
11 Timon1405
 
21.06.20
21:21
(8) ДокОбъект.Товары[Выборка.НомерСтроки].Цена = Объект.Цена;
такой код сломается на 1001 строке
12 Ёпрст
 
21.06.20
21:23
(11) с х..ли ?
13 Timon1405
 
21.06.20
21:29
(12) Пардон, сломался бы Сообщение.Поле = Товары[Выборка.НомерСтроки].Цена;//Сообщение.Сообщить()
14 D_E_S_131
 
22.06.20
12:09
(9) Если уж конечно "забить" на перебор всех документов, вместо выборки нужных документов запросом (как написано в (8) ), то хотя бы перед циклом перебора ТЧ документа сделай "ЕстьИзменения = Ложь;" , а внутри условия после установки новой цены "ЕстьИзменения = Истина;" и потом записывай документ если ЕстьИзменения, а не все документы подряд (препод хоть увидит, что ты пытаешься не угробить базу).