7.7 Дублировать цены в номенклатуре

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 7.7"", создана пользователем zes, 29 ноя 2010.

  1. TopicStarter Overlay
    zes
    Offline

    zes Опытный в 1С

    Регистрация:
    29 ноя 2010
    Сообщения:
    61
    Симпатии:
    0
    Баллы:
    26
    Здрасте.
    Вопрос такой:

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

    Как сделать чтобы цены просто копировались при обновлении какой-нить одной "ключевой" позиции?
    Т.е. вбил цену один раз, а эта цена распространилась на несколько позиций.

    Помогите пожалуйста.
  2. TopicStarter Overlay
    zes
    Offline

    zes Опытный в 1С

    Регистрация:
    29 ноя 2010
    Сообщения:
    61
    Симпатии:
    0
    Баллы:
    26
    В справочник "Номенклатура" добавил несколько реквизитов типа "Номенклатура": Копия1, Копия2, ... КопияN.
    в конец процедуры ПриЗаписи() добавляю вызов КопироватьЦены():
    Код:
    Процедура КопироватьЦены()
    Если ПустоеЗначение(Копия1)<>1 Тогда //если не пустое значение копии
    ДатаЦен = ИспользоватьДату();
    СпрЦены = СоздатьОбъект("Справочник.Цены");
    СпрЦены.ИспользоватьВладельца(Копия1);
    СпрЦены.ИспользоватьДату(ДатаЦен);
    СпрЦены.ВыбратьЭлементы();
    СпрЦены.Цена = Цена;
    СпрЦены.Валюта = "руб.";
    КонецЕсли;
    КонецПроцедуры // КопироватьЦены()
    
    
    Ругается:
    СпрЦены.Цена = Цена;
    {Справочник.Номенклатура.Форма.Модуль(398)}: Не выбран элемент!


    Понимаю что-то всёё как-то коряво написал код, по другому не знаю как.
  3. WaRDeR
    Offline

    WaRDeR Модераторы Команда форума Модератор

    Регистрация:
    23 ноя 2006
    Сообщения:
    3.263
    Симпатии:
    14
    Баллы:
    29
    После "ВыбратьЭлементы" нужно их в цикле получать "ПолучитьЭлемент"
  4. TopicStarter Overlay
    zes
    Offline

    zes Опытный в 1С

    Регистрация:
    29 ноя 2010
    Сообщения:
    61
    Симпатии:
    0
    Баллы:
    26
    При изменении цены справочнике "Цены" появляется новая запись для текущего элемента справочника.
    Мне нужно продублировать эту цену на другую запись в справочнике.
    Как мне это сделть?Подкажите пожалуйста

    Код:
    Процедура КопироватьЦены()
    Если ПустоеЗначение(Копия1)<>1 Тогда //если не пустое значение копии
    ДатаЦен = ИспользоватьДату();
    СпрЦены = СоздатьОбъект("Справочник.Цены");
    СпрЦены.ИспользоватьВладельца(Копия1);
    СпрЦены.ИспользоватьДату(ДатаЦен);
    СпрЦены.ВыбратьЭлементы();
    Пока СпрЦены.ПолучитьЭлемент()=1
    СпрЦены.Цена = Цена;
    СпрЦены.Валюта = "руб.";
    КонецЦикла:
    КонецЕсли;
    КонецПроцедуры // КопироватьЦены()
    
    
    Так?

    Думаю, что так работать не будет, ибо пока ещё нечего выбирать, так-как нет такого значения ещё.
  5. WaRDeR
    Offline

    WaRDeR Модераторы Команда форума Модератор

    Регистрация:
    23 ноя 2006
    Сообщения:
    3.263
    Симпатии:
    14
    Баллы:
    29
    Зачем тогда выбирать элементы?

    Нужно значит создавать.

    Я лично, не понимаю сути вопроса, поэтому не могу ответить ничего конкретного. Может картинки приложи... или опиши подробно свою структуру.
  6. TopicStarter Overlay
    zes
    Offline

    zes Опытный в 1С

    Регистрация:
    29 ноя 2010
    Сообщения:
    61
    Симпатии:
    0
    Баллы:
    26
    Наверное я не туда полез.

    В общем приведите пожалуйста пример, как записать периодический реквизит справочника, без вызова Обработка.ЗаписьПериодическихРеквизитов.
    Спасибо
  7. dianofob
    Offline

    dianofob (-_-)y-.o0O

    Регистрация:
    3 июл 2009
    Сообщения:
    711
    Симпатии:
    0
    Баллы:
    26
    Код:
    Спр = СоздатьОбъект("Справочник.Ваш");
    Спр.Новый();
    Спр.Записать();
    Спр.ВашПериодическийРек.Установить(ТекДата(),"ВашеЗначение");
    Спр.Записать();
    
    
    
    ТАк?
  8. dianofob
    Offline

    dianofob (-_-)y-.o0O

    Регистрация:
    3 июл 2009
    Сообщения:
    711
    Симпатии:
    0
    Баллы:
    26
    ну и ваш кусочек кода в первом посте будет выглядеть примерно так:
    Код:
    Процедура КопироватьЦены()
    Если ПустоеЗначение(Копия1) = 0 Тогда 
    ДатаЦен = '01.01.2010'; // ваша дата
    Копия1.РеквизитЦеныВСправочнике.Установить(ДатаЦен,Цена);
    Копия1.РеквизитВалютыЕслиПериодический = Установить(ДатаЦен,глВашаВалюта); // т.е. ссылка на валюту
    Копия1.Записать();
    КонецЕсли;
    КонецПроцедуры // КопироватьЦены()
    
    
  9. TopicStarter Overlay
    zes
    Offline

    zes Опытный в 1С

    Регистрация:
    29 ноя 2010
    Сообщения:
    61
    Симпатии:
    0
    Баллы:
    26
    Да, так я и сделал в итоге, спасибо. Только Записать() не нужно в конце, и так нормально.

    Ещё вопрос, как мне дату получить, ту которую, вводили при записи периодического реквизита?
    Поясню:
    Посмотреть вложение 5904
    Изменяем цену у "тест1":
    Посмотреть вложение 5905
    Выскакивает окно с записью периодических реквизитов:
    Посмотреть вложение 5909
    В процедуру ПриЗаписи() добавил:
    Код:
        Записать();
    КопироватьЦены();
    
    
    процедура копирования выглядит так:
    Код:
    Процедура КопироватьЦены()
    Если ПустоеЗначение(Копия1)<>1 Тогда //если не пустое значение копии
    спр=СоздатьОбъект("Справочник.Номенклатура");
    спр.ВыбратьЭлементы();
    спр.НайтиПоКоду(Копия1.Код,0);
    ДатаЦен = НачМесяца(РабочаяДата());
    спр.Цена.Установить(ДатаЦен, Цена); 
    КонецЕсли;
    КонецПроцедуры // КопироватьЦены()
    
    
    Тут я беру дату НачМесяца(РабочаяДата()), а как мне получить дату которая обведена красным на последнем скрине?

    Вложения:

    • 1.JPG
      1.JPG
      Размер файла:
      60,7 КБ
      Просмотров:
      11
    • 22.JPG
      22.JPG
      Размер файла:
      46,1 КБ
      Просмотров:
      13
    • 3.JPG
      3.JPG
      Размер файла:
      39,8 КБ
      Просмотров:
      15
  10. TopicStarter Overlay
    zes
    Offline

    zes Опытный в 1С

    Регистрация:
    29 ноя 2010
    Сообщения:
    61
    Симпатии:
    0
    Баллы:
    26
    Кстате, ругаеццо:
    Копия1.Цена.Установить(ДатаЦен,Цена);
    {Справочник.Номенклатура.Форма.Модуль(399)}: Недопустимая операция
  11. WaRDeR
    Offline

    WaRDeR Модераторы Команда форума Модератор

    Регистрация:
    23 ноя 2006
    Сообщения:
    3.263
    Симпатии:
    14
    Баллы:
    29
    Значит что-то не так сделано. Недостаточно исходной информации, что бы тебе ответить на вопрос. Тут можно только гадать

    Допустим, "Записать()" нужно всегда, но подразумевается, используется ссылка на объект. А у тебя похоже все делается с текущим объектом.... Короче - ничего не понятно
  12. TopicStarter Overlay
    zes
    Offline

    zes Опытный в 1С

    Регистрация:
    29 ноя 2010
    Сообщения:
    61
    Симпатии:
    0
    Баллы:
    26
    Да не, всё работает.
    Как мне дату добыть? В предыдущем моём посте полное описание?
  13. dianofob
    Offline

    dianofob (-_-)y-.o0O

    Регистрация:
    3 июл 2009
    Сообщения:
    711
    Симпатии:
    0
    Баллы:
    26
    Код:
    Процедура КопироватьЦены()
    Если ПустоеЗначение(Копия1)<>1 Тогда 
    спр=СоздатьОбъект(\"Справочник.Номенклатура\");
    спр.НайтиЭлемент(Копия1);
    ДатаЦен = НачМесяца(РабочаяДата());
    спр.Цена.Установить(ДатаЦен, Цена); 
    КонецЕсли;
    КонецПроцедуры 
    
    

    ну, а как она называется в конфигураторе? :)
  14. TopicStarter Overlay
    zes
    Offline

    zes Опытный в 1С

    Регистрация:
    29 ноя 2010
    Сообщения:
    61
    Симпатии:
    0
    Баллы:
    26
    При записи вызывается форма:
    Код:
    Процедура ПриЗаписи()
    
    Если ТипНоменклатуры.Выбран() = 0 Тогда
    Предупреждение("Выберите тип номенклатуры.");
    СтатусВозврата(0);
    Возврат;
    КонецЕсли;	
    Если Форма.СтавкаНДС.Видимость() = 0 Тогда
    СтавкаНДС = "";
    КонецЕсли;
    Если Форма.СтавкаНП.Видимость() = 0 Тогда
    СтавкаНП = "";
    КонецЕсли;Если Форма.СтавкаНП.Видимость() = 0 Тогда
    СтавкаНП = "";
    КонецЕсли;
    Если Форма.СтранаПроисхождения.Видимость() = 0 Тогда
    СтранаПроисхождения = 0;
    КонецЕсли;
    СтатусВозврата(глБухЗаписьПериодическихРеквизитов(Контекст));
    
    Записать();
    КопироватьЦены();
    
    КонецПроцедуры // ПриЗаписи()
    
    
    глБухЗаписьПериодическихРеквизитов, а там открывается форма в которой можно поменять дату, на которую производится запись период.реквизита.
    Как мне эту дату получить? Форма, которая показана на третьем скрине, после записи закрывается.
  15. TopicStarter Overlay
    zes
    Offline

    zes Опытный в 1С

    Регистрация:
    29 ноя 2010
    Сообщения:
    61
    Симпатии:
    0
    Баллы:
    26
    В глобальном модуле есть модуль:
    Код:
    Функция глЗаписьПериодическихРеквизитов(КонтекстФормы, СписокРеквизитов=0, НоваяДата=0, ПерваяДата=0, СвязьРеквизитов=0) Экспорт
    // Список параметров обработки ЗаписьПериодическихРеквизитов.
    Параметр = СоздатьОбъект("СписокЗначений");
    Параметр.Установить("КонтекстФормы",    КонтекстФормы);
    Параметр.Установить("СписокРеквизитов", СписокРеквизитов);
    Параметр.Установить("НоваяДата",        НоваяДата);
    Параметр.Установить("ПерваяДата",       ПерваяДата);
    Параметр.Установить("СвязьРеквизитов",  СвязьРеквизитов);
    ОткрытьФормуМодально("Обработка.ЗаписьПериодическихРеквизитов", Параметр);
    Возврат Параметр;
    КонецФункции // глЗаписьПериодическихРеквизитов()
    
    Собственно в этой обработке поле "НоваяДата".
    Вот всё что знаю.

    УСН
  16. dianofob
    Offline

    dianofob (-_-)y-.o0O

    Регистрация:
    3 июл 2009
    Сообщения:
    711
    Симпатии:
    0
    Баллы:
    26
    да причем тут функции..
    как она в конфигураторе называется?

Поделиться этой страницей