Имя: Пароль:
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. fantomrik@gmail.com
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
Решение, мягко говоря, плохое. Тебе придется поддерживать код в двух местах. Дублирование кода - не айс. Не знаю, как еще тебе сказать. Пожалуйста.
AdBlock убивает бесплатный контент. 1Сергей