Имя: Пароль:
1C
 
УТ 11.1 Программное создание документа установка цен и автоматический расчет цен
,
0 fantomrik
 
19.01.16
19:24
Камрады, день добрый!

Собственно хочу автоматом устанавливать цены через подписку при поступлении. Посмотрел по коду - сам черт ногу сломит как цены он рассчитывает (заполнить документ то не проблема, без самих цен). И больше всего смущает, что почти все процедуры расчета выполняются с участием формы документа...

Возможно кто то писал подобное, подскажите что мне действительно нужно? Док программно создаю, заполняю виды цен, заполняю товары. А далее как максимально просто рассчитать цены (по схемам СКД из видов цен)?

Спасибо!
1 fantomrik
 
19.01.16
19:33
Я просто как то сразу теряюсь, когда вижу что типовой механизм берет форму и в ней все рассчитывает. Программно то я без формы создаю объект.
Вот и подумал, может кто писал подобное, подскажет как максимально быстро раскопать это.
2 alalsl88
 
19.01.16
20:19
Есть конфигурация с  кодом, могу скинуть.
3 fantomrik
 
19.01.16
20:50
(2) скинь пожалуйста, надо на файлобменник, на почту не зайдет cf. [email protected]
4 fantomrik
 
19.01.16
22:16
Вопрос еще актуален, если кто сталкивался с задачей автоматического расчета цена при проведении поступления.
5 Nirvana
 
19.01.16
22:47
(4) Я не понимаю - тебе цены установить надо или документ создать?
Если создать документ "Установка цен номенклатуры" - достаточно сделать ввод на основании поступления - цены рассчитаются в соответствии с настройками видов цен.
А если нужно только цены установить - никакой документ создавать не надо, достаточно сделать записи в регистр сведений "Цены номенклатуры".
6 Cyberhawk
 
19.01.16
22:52
"достаточно сделать записи в регистр сведений "Цены номенклатуры"" // путем создания и проведения документа установки цен
7 fantomrik
 
19.01.16
23:07
(6) я так и хочу, но не могу понять, как в моем созданном документе рассчитать цены не руками, а запустив типовые механизмы расчёта
8 Nirvana
 
19.01.16
23:11
(6) Неправильно. Документ установки цен для записи цен в регистр не требуется, и основное назначение этого документа вообще не в этом.
9 Nirvana
 
19.01.16
23:12
(7) Всё это настраивается в видах цен.
10 DexterMorgan
 
19.01.16
23:12
(8) да ты ч0. А в чем основное назначение документа, просвети, плз
11 DexterMorgan
 
19.01.16
23:14
(5) Интересно какой регистратор будет у твоей записи? Корректировка регистров?
12 Cyberhawk
 
19.01.16
23:17
(7) Придется либо сэмулировать клиентский код (добиться его выполнения), либо переносить логику клиентского кода на сервер
13 Nirvana
 
19.01.16
23:20
(10) Как и любого другого - в фиксации факта действий пользователя. В данном случае - действий пользователя по изменению цен. Если же пользователь ничего не делает - всё устанавливается автоматически, то фиксировать нечего и документ не нужен.

(11) Если исходить из (0), то "Поступление товаров и услуг".
14 DexterMorgan
 
19.01.16
23:22
(13) Ну ты знаток. Такую чушь пишешь
15 DexterMorgan
 
19.01.16
23:22
(13) Откуда вылез?
16 fantomrik
 
19.01.16
23:24
(12) вот это и пугает ( не знаю как правильнее сделать
17 Мимохожий Однако
 
19.01.16
23:29
Чем не устраивает формирование нового документа Установка цен программно и без форм?
18 Cyberhawk
 
19.01.16
23:29
(16) Переложи ответственность на пользователя - вместо подписки привяжись к записи документа поступления в форме и показывай пользователю форму нового созданного документа
19 DexterMorgan
 
19.01.16
23:31
(13) Захожу тут в регистр сведений "Цены номенклатуры" и вижу, что режим записи у него - подчинение регистратору, а  регистраторами могут быть либо "Установка цен номенклатуры" либо "Корректировка регистров". Нужно с поддержки снять и добавить в регистраторы "Поступление товаров и услуг"?
20 Cyberhawk
 
19.01.16
23:32
(19) Чувак может путает с ценами номенклатуры контрагентов (поставщиков)
21 Cyberhawk
 
19.01.16
23:32
Хотя исходя из его ответов про формулы расчета цен, не путает...
22 Cyberhawk
 
19.01.16
23:32
Ну да ладно, ответы вроде даны, всем спасмбо
23 Cyberhawk
 
19.01.16
23:33
*спасибо
24 DexterMorgan
 
19.01.16
23:33
(20) Нее, просто дятел =)
25 Nirvana
 
19.01.16
23:58
(14)(19) Если тебе мои ответы не нужны, то нефиг и спрашивать.

А с поддержки снимать вообще нет никакого смысла - для доработок конфигурации это не требуется. И если автор что-то дописывает типа (0), то добавление в регистраторы поступления - сущий пустяк, и недоумевать тут не о чем.
26 fantomrik
 
20.01.16
00:00
(17) в том основной вопрос, не могу понять как рассчитывать цены без формы, но типовыми механизмами.
27 Nirvana
 
20.01.16
00:01
(16) Попробуй описать всю задачу в целом.
Для описанного в (0) есть вполне рабочий типовой механизм, непонятно чем он тебя не устраивает.
28 fantomrik
 
20.01.16
00:02
Я хочу менять регистор и тп. Хочу программно создать установку цен, заполнить, но что бы цены расчитались механизмами ут, так как в будущем виды цен и их формулы могут измениться
29 fantomrik
 
20.01.16
00:02
Я не хочу *
Опечатка
30 Nirvana
 
20.01.16
00:05
(28) Тогда чем тебя не устраивает ввод установки цен на основании поступления?
31 fantomrik
 
20.01.16
00:11
(30) с пользователей хочу снять нагрузку создания документа установка цен. Плюс скоро нужно будет создавать установку, заполняя данными закупочных цен из внешней sql базы и рассчитывать остальные виды цен.
32 fantomrik
 
20.01.16
02:26
(28) Собственно подумал можно пойти таким путем. На сервере создать (просто создать, не открывать) форму объекта Установка цен, вызвать процедуры (скопировав из модуля типовой формы к себе в модуль) заполнения, полученные данные перенести в объект и объект записать.

Начал это делать, наткнулся на следующее - процедуры в форме работают с данными УправляемаяФорма, а на сервере кодом
    ТекущаяФорма = ДокументУЦН.ПолучитьФорму("ФормаДокумента");

я получаю просто форму. Какие то элементы недоступны и процедуры не работают.

Как получить программно Управляемую форму? И как после ее заполнения, перенести данные в объект?

p.s. Все заполение вызывается из процедуры ПриСозданииНаСервере, и все вложенные процедуры исполняются на сервере, поэтому предположил, что такой вариант прокатит.
33 Mort
 
20.01.16
08:58
Подброшу ещё будущего гимора с этой затеей:
Цены номенклатуры имеют периодичность "день". Две установки по одной номенклатуре одной датой не сделаешь, а поступления - пожалуйста.
34 fantomrik
 
20.01.16
08:59
(33) Если типовыми средствами сделаю, у документа есть номер в пределах дня же, и когда руками создаешь установку, хоть 100 раз в день меняй цену.
35 lubitelxml
 
20.01.16
09:05
(34) либо Вы чего-то недопонимаете, либо все остальные
36 fantomrik
 
20.01.16
09:14
(35) Да бог с ним, с (34) нумерацией в пределах дня.
Как решить (32)  задачу? Так получится решить? Уже подумал, может возможно в объект записывать доп свойство свое, открывать форму типовым механизмом и если есть мое доп свойство, записывать заполненные данные в объект из формы.
37 fantomrik
 
20.01.16
10:40
Нашел такую стать http://catalog.mista.ru/public/236382/ но не понятно как получить или открыть упр форму у еще не записанного объекта (нет ссылки).

По типовому механизму, при создании на основании, в модуле объекта идет обработка заполнения объекта на основании поступления, дальше запускает процедура ПриСозданииНаСервере() модуля формы. Как мне имея еще не записанный объект запустить ПриСозданииНаСервере() формы этого объекта?
38 Nirvana
 
20.01.16
23:26
(31) Значит, ты изобретаешь травмоопасный велосипед.

Решение о том, какими должны быть цены, принимают люди, а не программа. Именно для этого в УТ и предназначен документ "Установка цен номенклатуры", который во всех случаях проводится пользователем, и никакой автоматической установки цен не предусмотрено. Предусмотрено, что автоматически могут быть рассчитаны цены и заполнен документ, но решение провести именно такие цены (или не проводить их) принимает конкретный человек с соответствующими полномочиями и ответственностью (для него и поле "Ответственный" предусмотрено). И если вдруг возникают какие-то вопросы по ценам, то это конкретное ответственное лицо и даёт ответы, почему именно такие цены.

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

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

(28) Здесь не совсем понятен механизм поступления и установки цен.
Что должно происходить при повторном проведении поступления: создаваться новая установка цен или перезаписываться ранее созданная?

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

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

Но, разумеется, для всего этого придётся в документе поступления продублировать процедуры расчёта цен и доделать запись в регистр сведений. И если уж ОЧЕНЬ НЕ ХОЧЕТСЯ с этим возиться, то можно, конечно, и создавать установку цен: делать программный ввод установки цен на основании, открывать форму, после чего либо записывать и проводить эту установку цен (и она сделает движения), либо брать через её форму табличную часть с рассчитанными ценами и использовать их в проведении поступления для записи в регистр (а форму установки цен просто закрывать без записи). Но надо понимать, что это означает дополнительное время на открытие формы, дополнительную запись документа (если сохранять установку) и сам дополнительный документ в базе (опять же, если записывать).
39 Nirvana
 
20.01.16
23:29
(32) Хотя, если всё заполнение (расчёт цен) выполняется в процедуре "ПриСозданииНаСервере" (я просто не помню), то можно и не открывать форму (это по поводу последнего абзаца в (38)).
40 Nirvana
 
20.01.16
23:30
(32) Ты пытаешься получить форму методом объекта, а нужно общим методом:
ПолучитьФорму("Документ.УстановкаЦенНоменклатуры.Форма.ФормаДокумента")

Как-то так...
41 Nirvana
 
20.01.16
23:36
(33)(34)(35) Периодичность "День" влияет только на так называемые виртуальные таблицы (типа "СрезПоследних").
Одинаковых движений в одном дне может быть сколько угодно - в разном времени, а в "СрезПоследних" попадёт последнее движение за день.
42 Nirvana
 
20.01.16
23:38
(37) При создании управляемой формы это должно случиться, см. (40).
43 fantomrik
 
23.01.16
20:48
(38) Есть такое понятие - руководство хочет. Раз хочет, сделаем, это "их" решение :)
В любом случае спасибо за ваши комментарии.
Собственно победил я эту задачу. Послушал умного совета и скопировав целиком модуль "УстановкаЦенСервер" немного поправил под нужды задачи.

Думаю подобная задача может еще раз всплыть, у меня ушло уйма времени на решение, поэтому ниже выложу "код".

В первом серверном модуле сама процедура создания установки установке цен на основании документа поступления.

Второй типовой модуль расчетов, с моими корректировками.

Конечно много не оптимально, но работает :) Надеюсь кому то пригодиться!
44 fantomrik
 
23.01.16
20:50
// Создает документ Установка цен номенклатуры на основании документа поступления
//
// Параметры:
//  <ДокументПоступления>  - <ДокументОбъект.ПоступлениеТоваровУслуг> >
//
//
Процедура УстановитьЦеныНоменклатуры(ДокументОснование)
    
    
    //Проверка на необходимость создания
    
    Запрос = Новый Запрос;
    Запрос.Текст =
        "ВЫБРАТЬ
        |    УстановкаЦенНоменклатуры.Ссылка
        |ИЗ
        |    Документ.УстановкаЦенНоменклатуры КАК УстановкаЦенНоменклатуры
        |ГДЕ
        |    УстановкаЦенНоменклатуры.Проведен
        |    И УстановкаЦенНоменклатуры.ДокументОснование = &ДокументОснование
        |    И УстановкаЦенНоменклатуры.Комментарий ПОДОБНО ""%Создан автоматически на основании поступления%""";
    
    Запрос.УстановитьПараметр("ДокументОснование", ДокументОснование.Ссылка);
    
    РезультатЗапроса = Запрос.Выполнить();
    
    Если НЕ РезультатЗапроса.Пустой() Тогда
        Возврат;
    КонецЕсли;
    
    //Создание и проведение документа установка цен
    НачатьТранзакцию();
    
    
    Запрос = Новый Запрос(
    "ВЫБРАТЬ
    |    ПоступлениеТоваровУслугТовары.Номенклатура КАК Номенклатура,
    |    ПоступлениеТоваровУслугТовары.Характеристика КАК Характеристика,
    |    ПоступлениеТоваровУслугТовары.Упаковка КАК Упаковка,
    |    ВидыЦен.Ссылка КАК ВидЦены,
    |    0 КАК Цена
    |ИЗ
    |    Документ.ПоступлениеТоваровУслуг.Товары КАК ПоступлениеТоваровУслугТовары
    |        ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ВидыЦен КАК ВидыЦен
    |        ПО (ВидыЦен.УстанавливатьЦенуПриВводеНаОсновании)
    |            И (НЕ ВидыЦен.ПометкаУдаления)
    |ГДЕ
    |    ПоступлениеТоваровУслугТовары.Ссылка = &Ссылка");
    Запрос.УстановитьПараметр("Ссылка", ДокументОснование.Ссылка);
    
    РезультатЗапроса = Запрос.Выполнить();
    Если РезультатЗапроса.Пустой() Тогда
        Текст = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
            НСтр("ru = 'Не требуется вводить установку цен номенклатуры на основании документа %1'"),
            ДокументОснование);
        ВызватьИсключение Текст;
    Иначе
        ДокументУЦН                   = Документы.УстановкаЦенНоменклатуры.СоздатьДокумент();
        ДокументУЦН.ДокументОснование = ДокументОснование.Ссылка;
        ДокументУЦН.Комментарий          = "Создан автоматически на основании поступления";
        ДокументУЦН.Товары.Загрузить(РезультатЗапроса.Выгрузить());
    КонецЕсли;    
    
    НомерВПределахДня = УстановкаЦенВызовСервера.РассчитатьНомерВПределахДня(УстановкаЦенКлиентСервер.ДатаДокумента(ТекущаяДата()), ДокументУЦН.Ссылка);
    ДокументУЦН.Дата = УстановкаЦенКлиентСервер.РассчитатьДатуДокумента(УстановкаЦенКлиентСервер.ДатаДокумента(ТекущаяДата()), НомерВПределахДня);

    ИспользоватьЦеновыеГруппы              = ПолучитьФункциональнуюОпцию("ИспользоватьЦеновыеГруппы");
    ИспользоватьХарактеристикиНоменклатуры = ПолучитьФункциональнуюОпцию("ИспользоватьХарактеристикиНоменклатуры");
    ИспользоватьУпаковкиНоменклатуры       = ПолучитьФункциональнуюОпцию("ИспользоватьУпаковкиНоменклатуры");
    ИспользоватьНесколькоВидовЦен          = ПолучитьФункциональнуюОпцию("ИспользоватьНесколькоВидовЦен");
    
    ПравоРегистрацииШтрихкодовНоменклатурыДоступно = ШтрихкодированиеНоменклатурыСервер.ПравоРегистрацииШтрихкодовНоменклатурыДоступно();
    
    СтруктураФорма = Новый Структура();
    
    СтруктураФорма.Вставить("Объект"                                                , ДокументУЦН);
    СтруктураФорма.Вставить("КодФормы"                                                , "");
    СтруктураФорма.Вставить("УникальныйИдентификатор"                                , Новый УникальныйИдентификатор);
    СтруктураФорма.Вставить("АвтоматическоеСоздание"                                , Истина);
    
    СтруктураФорма.Вставить("ИспользоватьНесколькоВидовЦен"                            , ИспользоватьНесколькоВидовЦен);
    СтруктураФорма.Вставить("ИспользоватьХарактеристикиНоменклатуры"                , ИспользоватьХарактеристикиНоменклатуры);
    СтруктураФорма.Вставить("ИспользоватьУпаковкиНоменклатуры"                        , ИспользоватьУпаковкиНоменклатуры);
    СтруктураФорма.Вставить("ИспользоватьЦеновыеГруппы"                                , ИспользоватьЦеновыеГруппы);
    
    СтруктураФорма.Вставить("АдресХранилищаДанныхДляРасчетаВычисляемыхЦенНаКлиенте"    , "");
    СтруктураФорма.Вставить("АдресХранилищаМассиваВлияющихЦен"                        , "");
    СтруктураФорма.Вставить("АдресХранилищаНастройкиКомпоновкиДанных"                , "");
    СтруктураФорма.Вставить("АдресХранилищаПараметровСхемКомпоновкиПоВидамЦен"        , "");
    СтруктураФорма.Вставить("ВыбранныеЦеныИзменены"                                    , Ложь);
    СтруктураФорма.Вставить("РассчитыватьАвтоматически"                                , Истина);
    СтруктураФорма.Вставить("Модифицированность"                                    , Истина);
    
    ВыбранныеЦены = Новый ТаблицаЗначений();
    ВыбранныеЦены.Колонки.Добавить("Ссылка"                                      , Новый ОписаниеТипов("СправочникСсылка.ВидыЦен"));
    ВыбранныеЦены.Колонки.Добавить("СпособЗаданияЦены"                        , Новый ОписаниеТипов("ПеречислениеСсылка.СпособыЗаданияЦен"));
    ВыбранныеЦены.Колонки.Добавить("Выбрана"                                , Новый ОписаниеТипов("Булево"));
    ВыбранныеЦены.Колонки.Добавить("Зависит"                                , Новый ОписаниеТипов("Булево"));
    ВыбранныеЦены.Колонки.Добавить("Влияет"                                    , Новый ОписаниеТипов("Булево"));
    ВыбранныеЦены.Колонки.Добавить("ВлияющиеЦены"                            , Новый ОписаниеТипов("СписокЗначений"));
    ВыбранныеЦены.Колонки.Добавить("ЗависимыеЦены"                            , Новый ОписаниеТипов("СписокЗначений"));
    ВыбранныеЦены.Колонки.Добавить("Уровень"                                , ОбщегоНазначенияУТ.ПолучитьОписаниеТиповЧисла(10,0));
    ВыбранныеЦены.Колонки.Добавить("Валюта"                                    , Новый ОписаниеТипов("СправочникСсылка.Валюты"));
    ВыбранныеЦены.Колонки.Добавить("РеквизитДопУпорядочивания"                , ОбщегоНазначенияУТ.ПолучитьОписаниеТиповЧисла(5,0));
    ВыбранныеЦены.Колонки.Добавить("Идентификатор"                            , ВариантыОтчетов.ОписаниеТиповСтрока(50));
    ВыбранныеЦены.Колонки.Добавить("Зависимый"                                , ВариантыОтчетов.ОписаниеТиповСтрока(0));
    ВыбранныеЦены.Колонки.Добавить("Наименование"                            , ВариантыОтчетов.ОписаниеТиповСтрока(0));
    ВыбранныеЦены.Колонки.Добавить("ИмяКолонки"                                , ВариантыОтчетов.ОписаниеТиповСтрока(0));
    ВыбранныеЦены.Колонки.Добавить("ЦеновыеГруппы"                            , Новый ОписаниеТипов("ТаблицаЗначений"));
    ВыбранныеЦены.Колонки.Добавить("Формула"                                , ВариантыОтчетов.ОписаниеТиповСтрока(0));
    ВыбранныеЦены.Колонки.Добавить("ПорогСрабатывания"                        , ОбщегоНазначенияУТ.ПолучитьОписаниеТиповЧисла(15,2));
    ВыбранныеЦены.Колонки.Добавить("ПорогиСрабатывания"                        , Новый ОписаниеТипов("ТаблицаЗначений"));
    ВыбранныеЦены.Колонки.Добавить("ВлияющиеВидыЦен"                        , Новый ОписаниеТипов("ТаблицаЗначений"));
    ВыбранныеЦены.Колонки.Добавить("ПравилаОкругленияЦены"                    , Новый ОписаниеТипов("ТаблицаЗначений"));
    ВыбранныеЦены.Колонки.Добавить("ОкруглятьВБольшуюСторону"               , Новый ОписаниеТипов("Булево"));
    ВыбранныеЦены.Колонки.Добавить("АдресСхемыКомпоновкиДанных"             , ВариантыОтчетов.ОписаниеТиповСтрока(0));
    ВыбранныеЦены.Колонки.Добавить("НайденыОбязательныеПараметры"           , Новый ОписаниеТипов("Булево"));
    ВыбранныеЦены.Колонки.Добавить("Параметры"                                 , ВариантыОтчетов.ОписаниеТиповСтрока(0));
    ВыбранныеЦены.Колонки.Добавить("ЗапрещенныйВидЦены"                       , Новый ОписаниеТипов("Булево"));
    ВыбранныеЦены.Колонки.Добавить("АдресНастроекСхемыКомпоновкиДанных"     , ВариантыОтчетов.ОписаниеТиповСтрока(0));
    ВыбранныеЦены.Колонки.Добавить("БазовыйВидЦены"                         , ВариантыОтчетов.ОписаниеТиповСтрока(0));
    ВыбранныеЦены.Колонки.Добавить("Наценка"                                , ОбщегоНазначенияУТ.ПолучитьОписаниеТиповЧисла(10,2));
    ВыбранныеЦены.Колонки.Добавить("УстанавливатьЦенуПриВводеНаОсновании"   , Новый ОписаниеТипов("Булево"));
    ВыбранныеЦены.Колонки.Добавить("ПометкаУдаления"                           , Новый ОписаниеТипов("Булево"));
    
    СтруктураФорма.Вставить("ВыбранныеЦены", ВыбранныеЦены);
    
    ДеревоЦен = Новый ДеревоЗначений;
    ДеревоЦен.Колонки.Добавить("Номенклатура"                               , Новый ОписаниеТипов("СправочникСсылка.Номенклатура"));
    ДеревоЦен.Колонки.Добавить("Характеристика"                               , Новый ОписаниеТипов("СправочникСсылка.ХарактеристикиНоменклатуры"));
    ДеревоЦен.Колонки.Добавить("ИндексКартинки"                               , ОбщегоНазначенияУТ.ПолучитьОписаниеТиповЧисла(5,0));
    ДеревоЦен.Колонки.Добавить("ЕдиницаИзмерения"                           , Новый ОписаниеТипов("СправочникСсылка.ЕдиницыИзмерения"));
    ДеревоЦен.Колонки.Добавить("ЦеноваяГруппа"                               , Новый ОписаниеТипов("СправочникСсылка.ЦеновыеГруппы"));
    ДеревоЦен.Колонки.Добавить("ХарактеристикиИспользуются"                   , Новый ОписаниеТипов("Булево"));
    ДеревоЦен.Колонки.Добавить("РеквизитСортировки"                           , ОбщегоНазначенияУТ.ПолучитьОписаниеТиповЧисла(10,0));
    ДеревоЦен.Колонки.Добавить("Артикул"                                       , ВариантыОтчетов.ОписаниеТиповСтрока(25));
    
    СтруктураФорма.Вставить("ДеревоЦен", ДеревоЦен);
    
    ЛЗ_УстановкаЦенСервер.ИнициализироватьВыбранныеЦены(СтруктураФорма);    
    
    ОтображатьВлияющиеЦены = ОбщегоНазначения.ХранилищеОбщихНастроекЗагрузить("УстановкаЦенНоменклатуры","УстановкаЦенНоменклатурыОтображатьВлияющиеЦены");
    
    ДанныеДляРасчетаВычисляемыхЦенНаКлиенте = ЗаполнитьДокумент(ДокументУЦН, СтруктураФорма);
    Если ДанныеДляРасчетаВычисляемыхЦенНаКлиенте <> Неопределено Тогда
        АдресХранилищаДанныхДляРасчетаВычисляемыхЦенНаКлиенте = ПоместитьВоВременноеХранилище(
        ДанныеДляРасчетаВычисляемыхЦенНаКлиенте,
        Новый УникальныйИдентификатор);
    КонецЕсли;
    
    УстановитьСостояние(ДокументУЦН);
    
    Попытка
        ДокументУЦН.Записать(РежимЗаписиДокумента.Проведение, РежимПроведенияДокумента.Неоперативный);
    Исключение
        Сообщить("Не удалось установить цены на основании " + ДокументОснование + " " + ОписаниеОшибки());
    КонецПопытки;
    
    ЗафиксироватьТранзакцию();

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


#Область Вспомогательные_процедуры_и_функции_для_создания_документа_установка_цен_номенклатуры

Функция ЗаполнитьДокумент(ТекущийОбъект, ТекущаяФорма)
    
    КэшДанных = ЛЗ_УстановкаЦенСервер.ИнициализироватьСтруктуруКэшаДанных();
    
    ДанныеДляРасчетаВычисляемыхЦенНаКлиенте = Неопределено;
    
    Если ТекущийОбъект.ВидыЦен.Количество() > 0 ИЛИ ТекущийОбъект.Товары.Количество() > 0 ИЛИ НЕ ТекущийОбъект.ИспользоватьНесколькоВидовЦен ИЛИ ТекущийОбъект.ВыбранныеЦены.Количество() = 1 Тогда
        
        Если УстановкаЦенКлиентСервер.ВыбранныеСтрокиТаблицыВидовЦен(ТекущаяФорма).Количество() > 0 Тогда
            ЛЗ_УстановкаЦенСервер.ПостроитьДеревоЦен(ТекущаяФорма);
            ЛЗ_УстановкаЦенСервер.ЗагрузитьТабличнуюЧастьТовары(ТекущаяФорма, КэшДанных);
            ЛЗ_УстановкаЦенСервер.ЗагрузитьБазовыеЦены(ТекущаяФорма, КэшДанных);
            Если ЛЗ_УстановкаЦенСервер.ЗаполненыОбязательныеПараметрыСхемКомпоновкиДанных(ТекущаяФорма, Ложь) Тогда
                ТекущаяФорма.Элементы.ГруппаСтраницы.ТекущТекущаяФорма.аяСтраница = ТекущаяФорма.Элементы.ГруппаУстановкаЦен;
            Иначе
                ТекущаяФорма.Элементы.ГруппаСтраницы.ТекущаяСтраница = ТекущаяФорма.Элементы.ГруппаВидыЦен;
            КонецЕсли;
        Иначе
            
            Если НЕ ТекущаяФорма.ИспользоватьНесколькоВидовЦен Тогда
                Для Каждого ТекСтрока Из ТекущийОбъект.ВыбранныеЦены Цикл
                    ТекСтрока.Выбрана = Истина;
                КонецЦикла;
            КонецЕсли;

            Если ТекущаяФорма.ВыбранныеЦены.Количество() = 1 Тогда
                Для Каждого ТекСтрока Из ТекущаяФорма.ВыбранныеЦены Цикл
                    ТекСтрока.Выбрана = Истина;
                КонецЦикла;
            КонецЕсли;
            
            // Документ вводится на основании Поступления товаров и услуг.
            // Необходимо выбрать цены, расчитываемые по документу поступления и переформировать таблицу цен.
            Если ЗначениеЗаполнено(ТекущийОбъект.ДокументОснование)
                И Не ЗначениеЗаполнено(ТекущийОбъект.Ссылка) Тогда
                
                Для Каждого ТекСтрока Из ТекущаяФорма.ВыбранныеЦены Цикл
                    Если ТекСтрока.УстанавливатьЦенуПриВводеНаОсновании Тогда
                        ТекСтрока.Выбрана = Истина;
                        НоваяСтрока = ТекущийОбъект.ВидыЦен.Добавить();
                        НоваяСтрока.ВидЦены = ТекСтрока.Ссылка;
                    КонецЕсли;
                КонецЦикла;
                
                УстановкаЦенКлиентСервер.ВыбратьВсеЗависимыеЦены(ТекущаяФорма);
                УстановкаЦенКлиентСервер.ВыбратьВсеВлияющиеЦены(ТекущаяФорма);
                ВыбранныеЦеныИзменены = Ложь;
                
                ВидыЗагружаемыхСтарыхЦен = Новый Массив();
                Для Каждого ТекСтрока Из ТекущаяФорма.ВыбранныеЦены Цикл
                    Если ТекСтрока.Выбрана И (ТекСтрока.СпособЗаданияЦены = Перечисления.СпособыЗаданияЦен.Вручную) Тогда
                        ВидыЗагружаемыхСтарыхЦен.Добавить(ТекСтрока);
                    КонецЕсли;
                КонецЦикла;
                
                ЛЗ_УстановкаЦенСервер.ПостроитьДеревоЦен(ТекущаяФорма);
                ЛЗ_УстановкаЦенСервер.ЗагрузитьТабличнуюЧастьТовары(ТекущаяФорма, КэшДанных);
                
                ЛЗ_УстановкаЦенСервер.ПоместитьВидыЦенВТабличнуюЧасть(ТекущаяФорма, ТекущийОбъект.ВидыЦен);
                //+fantomrik 2016-01-22 Перенесем в конец процедуры...
                //Данные = Новый Структура;
                //Данные.Вставить("Форма", ТекущаяФорма);
                //Данные.Вставить("Документы", Новый Массив);
                //Данные.Вставить("СохранятьБазовые", Ложь);
                //Данные.Документы.Добавить(ТекущийОбъект);
                //ЛЗ_УстановкаЦенСервер.ПоместитьЦеныВТабличнуюЧасть(Данные);
                //-fantomrik 2016-01-22  
                ЛЗ_УстановкаЦенСервер.ОбновитьСтарыеЦеныНоменклатуры(ТекущаяФорма, КэшДанных);
                
                ТаблицаНоменклатуры = ЛЗ_УстановкаЦенСервер.СоздатьТаблицуНоменклатурыПоДеревуЦен(ТекущаяФорма);
                ЛЗ_УстановкаЦенСервер.ЗагрузитьЗначенияБазовыхЦен(ТекущаяФорма, ТаблицаНоменклатуры, ВидыЗагружаемыхСтарыхЦен,, 0, Истина, КэшДанных);
                
                Если ЛЗ_УстановкаЦенСервер.ЗаполненыОбязательныеПараметрыСхемКомпоновкиДанных(ТекущаяФорма, Ложь) Тогда
                    
                    ЛЗ_УстановкаЦенСервер.ВычислитьЦеныПоДаннымИБ(ТекущаяФорма, ТаблицаНоменклатуры,,,КэшДанных);
                    
                    Если ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда
                        ДанныеДляРасчетаВычисляемыхЦенНаКлиенте = ЛЗ_УстановкаЦенСервер.ПодготовитьДанныеДляРасчетаВычисляемыхЦен(ТекущаяФорма, ТаблицаНоменклатуры,,,,КэшДанных);
                    Иначе
                        ЛЗ_УстановкаЦенСервер.РассчитатьВычисляемыеЦены(ТекущаяФорма, ТаблицаНоменклатуры,,,,КэшДанных);
                    КонецЕсли;
                    //+fantomrik 2016-01-22  
                    //ТекущаяФорма.Элементы.ГруппаСтраницы.ТекущаяСтраница = ТекущаяФорма.Элементы.ГруппаУстановкаЦен;
                    //-fantomrik 2016-01-22  
                Иначе
                    ПроверитьЗаполнениеПараметровПриОткрытии = Истина;
                КонецЕсли;
                
            Иначе
                
                ЛЗ_УстановкаЦенСервер.ПостроитьДеревоЦен(ТекущаяФорма);
                ЛЗ_УстановкаЦенСервер.ЗагрузитьТабличнуюЧастьТовары(ТекущаяФорма, КэшДанных);
                
            КонецЕсли;
            
        КонецЕсли;
        //+fantomrik 2016-01-22  
        Данные = Новый Структура;
        Данные.Вставить("Форма", ТекущаяФорма);
        Данные.Вставить("Документы", Новый Массив);
        Данные.Вставить("СохранятьБазовые", Ложь);
        Данные.Документы.Добавить(ТекущийОбъект);
        ЛЗ_УстановкаЦенСервер.ПоместитьЦеныВТабличнуюЧасть(Данные);
        //-fantomrik 2016-01-22  
    КонецЕсли;
    
    Возврат ДанныеДляРасчетаВычисляемыхЦенНаКлиенте;
    
КонецФункции

Процедура УстановитьСостояние(ТекущийОбъект)
    
    Если ТекущийОбъект.Проведен И ТекущийОбъект.Статус = Перечисления.СтатусыУстановокЦенНоменклатуры.Согласован Тогда
        Состояние = Перечисления.СостоянияУстановокЦенНоменклатуры.Действует;
    ИначеЕсли ТекущийОбъект.Проведен И ТекущийОбъект.Статус = Перечисления.СтатусыУстановокЦенНоменклатуры.НеСогласован Тогда
        Состояние = Перечисления.СостоянияУстановокЦенНоменклатуры.ОжидаетсяСогласование;
    Иначе
        Состояние = Перечисления.СостоянияУстановокЦенНоменклатуры.ПустаяСсылка();
    КонецЕсли;
    
    Просрочен = ТекущийОбъект.Статус = Перечисления.СтатусыУстановокЦенНоменклатуры.НеСогласован И НачалоДня(ТекущийОбъект.Дата) < НачалоДня(ТекущаяДата());
    
КонецПроцедуры

#КонецОбласти
45 fantomrik
 
23.01.16
20:55
в ЛЗ_УстановкаЦенСервер 5000 строк, не влазит сюда) Сохранил в тхт https://yadi.sk/i/gb_qNcp8nciND
46 fantomrik
 
23.01.16
20:56
Тема закрыта, решена, всем спасибо!
47 Cyberhawk
 
24.01.16
00:30
Решение, мягко говоря, плохое. Тебе придется поддерживать код в двух местах. Дублирование кода - не айс. Не знаю, как еще тебе сказать. Пожалуйста.
Я не хочу быть самым богатым человеком на кладбище. Засыпать с чувством, что за день я сделал какую-нибудь потрясающую вещь — вот что меня интересует. Стив Джобс