8.х Дополнительный разрез для установки цен

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 8"", создана пользователем OlgaOsipova, 10 фев 2011.

  1. TopicStarter Overlay
    OlgaOsipova
    Offline

    OlgaOsipova Опытный в 1С

    Регистрация:
    14 сен 2010
    Сообщения:
    273
    Симпатии:
    1
    Баллы:
    29
    Необходимо назначить цену в дополнительном разрезе (например партия)

    В документе УстановкаЦенНоменклатуры колонки табличной части формируются динамически в процессе исполнения кода.
    Код:
    Код:
    Процедура ОбновитьСоставКолонок()
    
    // Надо расположить все нужные колонки в правильном порядке.
    // Сначала должна идти колонка "Код".
    КолонкиТаблицыЦен = ТаблицаЦен.Колонки;
    ОчереднойНомерКолонки = 1;
    
    ТекущаяКолонка = КолонкиТаблицыЦен.Найти("Код");
    СдвинутьКолонку(ТекущаяКолонка, ОчереднойНомерКолонки);
    
    ТекущаяКолонка = КолонкиТаблицыЦен.Найти("Артикул");
    СдвинутьКолонку(ТекущаяКолонка, ОчереднойНомерКолонки);
    
    ТекущаяКолонка = КолонкиТаблицыЦен.Найти("Номенклатура");
    СдвинутьКолонку(ТекущаяКолонка, ОчереднойНомерКолонки);
    
    ТекущаяКолонка = КолонкиТаблицыЦен.Найти("ХарактеристикаНоменклатуры");
    СдвинутьКолонку(ТекущаяКолонка, ОчереднойНомерКолонки);
    
    //Мой фрагмент
    ТекущаяКолонка = КолонкиТаблицыЦен.Найти("Партия");
    СдвинутьКолонку(ТекущаяКолонка, ОчереднойНомерКолонки);
    //Мой фрагмент
    ….
    КонецПроцедуры
    
    
    Выдает ошибку о несоответствие типов значений:
    {Документ.УстановкаЦенНоменклатуры.Форма.ФормаДокумента(209)}: Ошибка при вызове метода контекста (Индекс): Несоответствие типов (параметр номер '1')
    ТекущийНомерКолонки = КолонкиТаблицыЦен.Индекс(Колонка);

    Ну понятно, что тип не соответствует, но в процессе исполнения кода смотрим на значения, для стандартных колонок тип = КолонкаТаблициЗначений, но у меня вообще не показывает значение


    Код:
    Процедура СдвинутьКолонку(Колонка, ОчереднойНомерКолонки)
    
    КолонкиТаблицыЦен = ТаблицаЦен.Колонки;
    
    ТекущийНомерКолонки = КолонкиТаблицыЦен.Индекс(Колонка); //здесь выдает ошибку
    Если ТекущийНомерКолонки <> ОчереднойНомерКолонки Тогда // сдвинем колонку
    КолонкиТаблицыЦен.Сдвинуть(ТекущийНомерКолонки, ОчереднойНомерКолонки - ТекущийНомерКолонки);
    КонецЕсли;
    
    ВсегоКолонок = КолонкиТаблицыЦен.Количество();
    ОчереднойНомерКолонки = ОчереднойНомерКолонки + 1;
    ОчереднойНомерКолонки = ?(ОчереднойНомерКолонки > ВсегоКолонок, ВсегоКолонок, ОчереднойНомерКолонки);
    
    КонецПроцедуры
    
    
    Подскажите пожалуйста куда копать :)
  2. has
    Offline

    has Опытный в 1С

    Регистрация:
    18 июн 2009
    Сообщения:
    708
    Симпатии:
    0
    Баллы:
    26
    Значит ТекущаяКолонка = Неопределено. Колонку не нашел.
  3. Неназываемый
    Offline

    Неназываемый Опытный в 1С Команда форума

    Регистрация:
    2 фев 2007
    Сообщения:
    507
    Симпатии:
    7
    Баллы:
    29
    В "ТаблицаЦен" нет колонки "Партия"
  4. TopicStarter Overlay
    OlgaOsipova
    Offline

    OlgaOsipova Опытный в 1С

    Регистрация:
    14 сен 2010
    Сообщения:
    273
    Симпатии:
    1
    Баллы:
    29
    У меня проскакивали такие мысли... А где эта таблица цен? В самом документе УстановкаЦенНоменклатуры я такой и не нашла, ни в реквизитах, ни в таблицах
  5. TopicStarter Overlay
    OlgaOsipova
    Offline

    OlgaOsipova Опытный в 1С

    Регистрация:
    14 сен 2010
    Сообщения:
    273
    Симпатии:
    1
    Баллы:
    29
    Простите туплю :) Это в форме документа
  6. gosn1ck
    Offline

    gosn1ck Опытный в 1С

    Регистрация:
    13 авг 2009
    Сообщения:
    1.329
    Симпатии:
    1
    Баллы:
    26
    вы характеристики или серии используете? если нет, то используйте их вместо новых разрезов, тем более что переписывать будет наааамно меньше
  7. TopicStarter Overlay
    OlgaOsipova
    Offline

    OlgaOsipova Опытный в 1С

    Регистрация:
    14 сен 2010
    Сообщения:
    273
    Симпатии:
    1
    Баллы:
    29
    Думаю вы правы. Мне нужно чтобы характеристика принадлежала не конкретному элементу номенклатуры, а справочнику в целом.
    То есть характеристика "партия №1" должна подставляться к любой позиции номенклатуры.

    Если переделать справочник характеристика, то начинаются косяки с тем, что она должна принадлежать кому нибудь конкретному.

    С серией еще не пробовала. Попробую отпишусь
  8. gosn1ck
    Offline

    gosn1ck Опытный в 1С

    Регистрация:
    13 авг 2009
    Сообщения:
    1.329
    Симпатии:
    1
    Баллы:
    26
    зачем ?
    зы на переписку только одного документа УЦН уйдёт уйма времени, а вас еще ждут модули ценообразования :)
  9. TopicStarter Overlay
    OlgaOsipova
    Offline

    OlgaOsipova Опытный в 1С

    Регистрация:
    14 сен 2010
    Сообщения:
    273
    Симпатии:
    1
    Баллы:
    29
    Спасибо, что переубедили :)
    Как мне когда то давно рекомендовали сделать обработку для создания однотипных элементов справочника характеристика номенклатуры

    Вот что получилось
    Код:
    Процедура ОсновныеДействияФормыЗаписатьПартию(Кнопка)
    ИмяПартии = "Партия №" + НомерПартии;
    
    
    Для Каждого Товар Из Товары Цикл
    //Запрос на проверку уже существующей партии
    Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ
    |	ХарактеристикиНоменклатуры.Владелец,
    |	ХарактеристикиНоменклатуры.Наименование,
    |	ХарактеристикиНоменклатуры.Ссылка КАК Ссылка
    |ИЗ
    |	Справочник.ХарактеристикиНоменклатуры КАК ХарактеристикиНоменклатуры
    |ГДЕ
    |	ХарактеристикиНоменклатуры.Владелец = &Владелец
    |	И ХарактеристикиНоменклатуры.Наименование = &Наименование";
    Запрос.УстановитьПараметр("Владелец", Товар.Номенклатура);
    Запрос.УстановитьПараметр("Наименование", ИмяПартии);
    Результат = Запрос.Выполнить();
    
    
    Если Результат.Пустой() Тогда
    //Создадим новый элемент справочника и запишем параметры
    СпрХарактеристика = Справочники.ХарактеристикиНоменклатуры;
    НовыйСпрХарактеристика 				= СпрХарактеристика.СоздатьЭлемент();
    НовыйСпрХарактеристика.Владелец 	= Товар.Номенклатура;
    НовыйСпрХарактеристика.Наименование = ИмяПартии;
    НовыйСпрХарактеристика.Параметр1         = Товар.Параметр1;
    НовыйСпрХарактеристика.Параметр2 	= Товар.Параметр2;
    НовыйСпрХарактеристика.Параметр3 	= Товар.Параметр3;
    НовыйСпрХарактеристика.Записать();
    
    //Подставим значение созданной характеристики в ТЧ товары
    Результат = Запрос.Выполнить();
    Выборка = Результат.Выбрать();
    Пока Выборка.Следующий() Цикл
    Товар.ХарактеристикаНоменклатуры = Выборка.Ссылка;
    КонецЦикла;
    
    Сообщить("Записано " + Товар.Номенклатура);
    Иначе
    Сообщить("Такая партия уже существует! " + Товар.Номенклатура);
    КонецЕсли;			
    КонецЦикла;
    КонецПроцедуры
    
    
    Но чую одним местом, что это далеко не самый оптимальный механизм. Подскажите, что можно оптимизировать :)
  10. gosn1ck
    Offline

    gosn1ck Опытный в 1С

    Регистрация:
    13 авг 2009
    Сообщения:
    1.329
    Симпатии:
    1
    Баллы:
    26
    вынесите запрос за цикл.

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