Версия для печати темы (https://pro1c.org.ua/index.php?s=af12a9e3906bca78aa21fbeb85b15b4d&showtopic=739)

Нажмите сюда для просмотра этой темы в обычном формате

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 _ Программирование в 1С Предприятие 8.1 (8.0) _ Передача параметра в документ

Автор: Batchir 31.07.09, 16:30

УТ 2.3.3.4
Вобщем стоит такая задача:

Создается прогаммно документ перемещения
ДокПеремещения = Документы.ПеремещениеТоваров.СоздатьДокумент();

Потом идет заполнение шапки и табличной части, ну и собственно проведение.

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


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

Необходимо каким-то образом передать временный параметр в документ, что бы не выдавать это сообщение, при восстановленни партий должно ругаться идти стандартным образом.

Автор: logist 31.07.09, 17:40

Цитата(Batchir @ 31.07.09, 18:30) *
Необходимо каким-то образом передать временный параметр в документ, что бы не выдавать это сообщение, при восстановленни партий должно ругаться идти стандартным образом.


Добавить реквизит с галкой в форме "ПроводитьПартии"
В модуле ОбработкаПроведения()
УправлениеЗапасами.ДобавитьСтрокуВДеревоПолейЗапросаПоШапке(ДеревоПолейЗапросаПоШапке, "УчетнаяПолитика",  "ВестиПартионныйУчетПоСкладам",               "ВестиПартионныйУчетПоСкладам");

заменить на

Если ПроводитьПартии Тогда
УправлениеЗапасами.ДобавитьСтрокуВДеревоПолейЗапросаПоШапке(ДеревоПолейЗапросаПоШапке, "УчетнаяПолитика",  "ВестиПартионныйУчетПоСкладам",               "ВестиПартионныйУчетПоСкладам");
Иначе
УправлениеЗапасами.ДобавитьСтрокуВДеревоПолейЗапросаПоШапке(ДеревоПолейЗапросаПоШапке, "УчетнаяПолитика",  "ВестиПартионныйУчетПоСкладам",               Ложь);
КонецЕсли;


Правда надо как-то удостоверится что когда надо провести по партиям - галка будет действительно включена. Человеческий фактор smile.gif

Автор: Batchir 31.07.09, 19:04

Дело в том что по партиям нужно проводить, просто чтоб сообщение не выдавалось о не достатке партий (сама процедура выдачи сообщения описана в общем модуле).
Повторюсь документ создается, заполняется и проводится програмно из обработки и именно при таком проведении необходимо не выдавать сообщение.
Если добавить реквизит, то флаг останется стоять и восстановление последовательности не выдаст сообщения.
т.е. нужно каким-то образом передать параметр, который будет действовать только на одно проведение.
Я думаю нужно добавить какую-то глобальную переменную, по умолчанию принимающее значение ЛОЖЬ, в обработке присваивать ей ИСТИНА и в момент выдачи сообщения о не нехватке партии не выдавать сообщений и заново присваивать ей ЛОЖЬ, тогда как бы соблюдается универсальность: всегда когда мне понадобится такой маневр при проведении любого документа нужно присвоить этой переменной значение ИСТИНА.

Автор: logist 31.07.09, 20:25

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

с глобальной переменной это хорошо, но только лучше что бы по умолчанию она была ИСТИНА, т.е. в процедурах Сообщений результатов проведения партий (их вроде две) в модуле партионного учета, добавить /Если Истина Тогда/ и далее оставить "Сообщить()"
И при необходимости присваивать значение Ложь.

Но все равно не понятно зачем проводить по партиям если результат проведения значения не имеет, и все равно в последствии будет окончательное проведение. Я хотел сказать что галку ставить руками в момент окончательного проведения.

Автор: zetovich 31.07.09, 20:54

бред....что значит пугающее? темноты боятся?
и ваще с такой постановкой...весь гемор Вам разгребать. Пока не раздуплились с сериями нехер перемещать ваще.
млин, вот кто придумал что пугает?

Автор: sergefox 31.07.09, 22:24

А обязательно проводить документ, если он будет потом перепроводиться?
Может проще ограничиться РежимЗаписиДокумента.Запись?
Тогда исчезнут все траблы с сообщениями о нехватке.

Автор: Batchir 31.07.09, 22:37

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

Автор: Batchir 31.07.09, 22:38

Цитата(sergefox @ 31.07.09, 23:24) *
А обязательно проводить документ, если он будет потом перепроводиться?
Может проще ограничиться РежимЗаписиДокумента.Запись?
Тогда исчезнут все траблы с сообщениями о нехватке.

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

Автор: Batchir 31.07.09, 23:07

Цитата(logist @ 31.07.09, 21:25) *
Процедура выдачи сообщения которая описана в общем модуле и модуле партионного учета в итоге вызывает Сообщить(), отключить ее, я так понимаю, нельзя.

с глобальной переменной это хорошо, но только лучше что бы по умолчанию она была ИСТИНА, т.е. в процедурах Сообщений результатов проведения партий (их вроде две) в модуле партионного учета, добавить /Если Истина Тогда/ и далее оставить "Сообщить()"
И при необходимости присваивать значение Ложь.

Но все равно не понятно зачем проводить по партиям если результат проведения значения не имеет, и все равно в последствии будет окончательное проведение. Я хотел сказать что галку ставить руками в момент окончательного проведения.


Ну поповду ИСТИНА-ЛОЖЬ - мы об одном и том же говорим

А по поводу галки - руками ничего не делается. Ввод документов осуществляется программно из специальных АРМов, по этому глобальная переменная - я думаю это как раз моё решение проблемы.

Автор: agav 31.07.09, 23:34

А нельзя ли отказаться от проведения по партиям при проведении документов, а запускать функционал обработки "проведение по партиям" каким-нить регламентным заданием раз в день?

Автор: logist 01.08.09, 7:59

Цитата(Batchir @ 01.08.09, 0:37) *
В файлах может быть товар с одной серией, а реально приходит товар и в оригинальной накладной другая серия. Разработан сложный механизм контроля приемки и выявления ошибок поставки товара.

А почему Вы не хотите использовать документ "Корректировка серий товаров"? Если механизм предполагает контроль, то в таком случае будет фиксация ошибок и ненужно перепроводить документы партий

Автор: Batchir 01.08.09, 10:18

Цитата(logist @ 01.08.09, 8:59) http://pro1c.org.ua/index.php?act=findpost&pid=3209
А нельзя ли отказаться от проведения по партиям при проведении документов, а запускать функционал обработки "проведение по партиям" каким-нить регламентным заданием раз в день?

Всё это и так делается (в фоновом режиме идет восстановление последовательности партий), но нужны оперативные данные по партиям по всей цепочке приемки.

Автор: хакерок 01.08.09, 12:10

помоему нужно разобраться от куда выдаёться сообщение а затем что сделать чтоб это условие не проверялось.

Автор: zetovich 01.08.09, 12:18

все равно не пойму...ну ругается на парти, ну ладно.
главное что по ОстаткамТоваров все нормальною....провелось....и ладно....потом уже разрулят партии.

Автор: logist 01.08.09, 13:01

Цитата(хакерок @ 01.08.09, 14:10) *
помоему нужно разобраться от куда выдаёться сообщение а затем что сделать чтоб это условие не проверялось.

Уже разобрались и решили что делать (читайте выше).

Но я считаю, что отключение сообщения это не выход, точнее не совсем тот выход из ситуации.

Автор: Batchir 01.08.09, 13:17

Цитата(logist @ 01.08.09, 14:01) *
Уже разобрались и решили что делать (читайте выше).
Но я считаю, что отключение сообщения это не выход, точнее не совсем тот выход из ситуации.

Для меня это как раз выход, столкнулся со следующим: необходимо передать значение глабальной переменной на сервер, т.е. объявить её так, что бы она была доступной на сервере предприятия

Автор: Batchir 01.08.09, 13:18

Цитата(zetovich @ 01.08.09, 13:18) *
все равно не пойму...ну ругается на парти, ну ладно.
главное что по ОстаткамТоваров все нормальною....провелось....и ладно....потом уже разрулят партии.

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

Автор: logist 01.08.09, 14:22

Цитата(Batchir @ 01.08.09, 15:17) *
Для меня это как раз выход, столкнулся со следующим: необходимо передать значение глабальной переменной на сервер, т.е. объявить её так, что бы она была доступной на сервере предприятия


глЗначениеПеременнойУстановить(Имя, Значение)

Автор: Batchir 01.08.09, 14:25

Цитата(logist @ 01.08.09, 15:22) *
глЗначениеПеременнойУстановить(Имя, Значение)

Пытался, но почему то с первого раза не пошло, сейчас ещё раз попробую, если не получится то наверно через константу буду пробывать

Автор: Batchir 01.08.09, 14:30



Попытка
Попытка
а1сВыводитьСообщенияОНедостачеПартий = глЗначениеПеременной("а1сВыводитьСообщенияОНедостачеПартий");
Исключение
глЗначениеПеременнойУстановить("а1сВыводитьСообщенияОНедостачеПартий",Истина);
а1сВыводитьСообщенияОНедостачеПартий = глЗначениеПеременной("а1сВыводитьСообщенияОНедостачеПартий");
КонецПопытки;
Исключение
Сообщить("Ошибка")
КонецПопытки;



Такой код на сервере предприятия выдает "Ошибка"

Автор: sergefox 01.08.09, 14:34

Передать параметр в форму документа очень просто.
Добавить реквизит формы с названием типа лНеВыводитьСообщения и типом Булево.
По умолчанию оно будет иметь значение Ложь.
При вызове формы документа из твоей обработки устанавливать значение реквизита.
Если форма не открывается - для оператора все проходит "в темную" - тогда добавить реквизит типа Булево в документ и в обрабоке проведения модуля документа вставить условие обхода этой ситуации:
Если НЕ (ТипЗнач() = "Документ.Перемещение" И лНеВыводитьСообщения) Тогда
Сообщить();
КонецЕсли
В этом случае ни человеческий фактор (в форме документа этот реквизит не будет присутствовать) ни другие волнующие тебя проблемы не будут проявляться.
Единственно, нужно отслеживать изменения при накате обновлений.

Автор: logist 01.08.09, 15:05

Цитата(Batchir @ 01.08.09, 16:30) *


глЗначениеПеременнойУстановить("а1сВыводитьСообщенияОНедостачеПартий",Истина);



А если так:
глЗначениеПеременнойУстановить("а1сВыводитьСообщенияОНедостачеПартий", Истина, ОбновлятьВоВсехКэшах = Ложь);

Автор: Batchir 01.08.09, 15:38

Цитата(sergefox @ 01.08.09, 15:34) *
Передать параметр в форму документа очень просто.
Добавить реквизит формы с названием типа лНеВыводитьСообщения и типом Булево.
По умолчанию оно будет иметь значение Ложь.
При вызове формы документа из твоей обработки устанавливать значение реквизита.
Если форма не открывается - для оператора все проходит "в темную" - тогда добавить реквизит типа Булево в документ и в обрабоке проведения модуля документа вставить условие обхода этой ситуации:
Если НЕ (ТипЗнач() = "Документ.Перемещение" И лНеВыводитьСообщения) Тогда
Сообщить();
КонецЕсли
В этом случае ни человеческий фактор (в форме документа этот реквизит не будет присутствовать) ни другие волнующие тебя проблемы не будут проявляться.
Единственно, нужно отслеживать изменения при накате обновлений.

А подумай как твоя схема отработает в случае когда: В "темную" провелся документ, у него стоит лНеВыводитьСообщения=ИСТИНА
документ никто не открывает. Правят приходну вручную, запускают восстановление партий, документ перемещения проведется и не ругнется, а надо что бы ругался.

Автор: Batchir 01.08.09, 15:46

Цитата(logist @ 01.08.09, 16:05) *
А если так:
глЗначениеПеременнойУстановить("а1сВыводитьСообщенияОНедостачеПартий", Истина, ОбновлятьВоВсехКэшах = Ложь);

глЗначениеПеременной("а1сВыводитьСообщенияОНедостачеПартий") на сервере предприятия отрабатывает с ошибкой, блин чую что можно как-то сделать, вот только не могу понять как.

Автор: Batchir 01.08.09, 16:19

Вобщем спаибо logist за помощь этот фрагмент отработал на сервере номально
При запуске 1С в модуле приложения выполняю:



глЗначениеПеременнойУстановить("а1сВыводитьСообщенияОНедостачеПартий", Истина, Истина);

и в общем модуле стандартную часть вывода сообщений заменил на


// ==============================
// Добавлено а1с:РБ: 31.07.2009
Попытка
Попытка
а1сВыводитьСообщенияОНедостачеПартий = глЗначениеПеременной("а1сВыводитьСообщенияОНедостачеПартий");
Исключение
глЗначениеПеременнойУстановить("а1сВыводитьСообщенияОНедостачеПартий", Истина, Истина);
а1сВыводитьСообщенияОНедостачеПартий = глЗначениеПеременной("а1сВыводитьСообщенияОНедостачеПартий");
КонецПопытки;
Исключение
а1сВыводитьСообщенияОНедостачеПартий = Истина;
КонецПопытки;
// ==============================

// Товара не хватило
Если (КоличествоОсталосьПогасить > 0) Тогда
// ==============================
// Добавлено а1с:РБ: 31.07.2009
Если а1сВыводитьСообщенияОНедостачеПартий Тогда
СообщитьОНехваткеПартии(СтрокаДокумента, СтруктураПараметров,
РегистрУчета, КоличествоОсталосьПогасить);
КонецЕсли;
// закоментировано
//СообщитьОНехваткеПартии(СтрокаДокумента, СтруктураПараметров, РегистрУчета, КоличествоОсталосьПогасить);
// ==============================

Иначе
Если ЗначениеЗаполнено(СтрокаДокумента.ДокументПартии)
И (СтрокаДокумента.КодОперацииПартииТоваров = Перечисления.КодыОперацийПартииТоваров.ВозвратПоставщику)
И (КоличествоСписанноеПоДоументуПартии < СтрокаДокумента.Количество) Тогда
// ==============================
// Добавлено а1с:РБ: 31.07.2009
Если а1сВыводитьСообщенияОНедостачеПартий Тогда
СообщитьОНеполномСписанииУказаннойПартии(СтрокаДокумента, СтруктураПараметров,
РегистрУчета, КоличествоОсталосьПогасить);
КонецЕсли;
// закоментировано
//СообщитьОНеполномСписанииУказаннойПартии(СтрокаДокумента, СтруктураПараметров, РегистрУчета,
КоличествоОсталосьПогасить);
// ==============================
КонецЕсли;
КонецЕсли;
// ==============================
// Добавлено а1с:РБ: 31.07.2009
глЗначениеПеременнойУстановить("а1сВыводитьСообщенияОНедостачеПартий", Истина, Истина);
// ==============================


И все заработало.
З.Ы. + везде поставил wink.gif

Автор: zetovich 01.08.09, 18:16

вот не докноца...видно....это всем/всегда НЕ будет выводится сие сообщенеи?
как помне из за таких проблем менять конфу....не
пусть тетя окошко внизу свернет...

Автор: Batchir 01.08.09, 18:48

Цитата(zetovich @ 01.08.09, 19:16) *
вот не докноца...видно....это всем/всегда НЕ будет выводится сие сообщенеи?
как помне из за таких проблем менять конфу....не
пусть тетя окошко внизу свернет...

Оно должно не выводится только в тех случаях, где мне нужно.
zetovich, неужели думаешь, что год разрабатывалась конфа на основе УТ и не менялась?
Там столько сделано ... мама не горюй ... Сеть аптек (20 шт), центральный офис и склад до этого сидели на заточенном и полностью передаланным под них тисе. База и требования к ней уже переросли свои возможности. Сейчас написан обмен между 7.7 и 8.1, т.к. переход планируется плавный. Сначала офис и склад переходят на 8.1, т.е. фактически функцонируют параллельно две конфы и пока последняя точка не перейдет на 8.1 так и будет. УТ дописана под них конкретно (штаный механизм старались торгать по минимуму), но шла в основном надстройка над типовой конфой, что бы оставить возможность обновлений, пусть даже и тяжелых. После синхронизации 7.7 и 8.1 база в 8.1 превышает 40 ГБ.
Просто хочу сказать что выражения типа "как помне из за таких проблем менять конфу" в этом случае не уместны.
Я сам когда мне говорят "хочу вот видеть то и то" и есть два пути решения: один легкий но с доработками конфы, а другой тяжелый но с испоьзованием каких то внешних обработок, то стараюсь делать второй вариант, предупреждая заказчика что сейчас Вы заплатите больше, но вдальнейшем без проблем будете обновляться.

Автор: logist 01.08.09, 19:48

Цитата(Batchir @ 01.08.09, 20:48) http://pro1c.org.ua/index.php?act=findpost&pid=3236
Я сам когда мне говорят "хочу вот видеть то и то" и есть два пути решения: один легкий но с доработками конфы, а другой тяжелый но с испоьзованием каких то внешних обработок, то стараюсь делать второй вариант, предупреждая заказчика что сейчас Вы заплатите больше, но вдальнейшем без проблем будете обновляться.

+1

Автор: Batchir 01.08.09, 21:05

Цитата(logist @ 01.08.09, 20:48) *
Я мало понял, что же Вы все таки там делаете smile.gif Но из того, что я понял, я бы наверное искал другое решение, возможно "людское".

Перевод крупной одесской сети аптек с уже написанной нами конфы на базе ТиС на УТ 8.1, серьёзный, крупный проект с огромным бюджетом. Я говорил, что описать всё немогу, лишь столкнулся с некоторыми вещами, которые просто нужно подправить.
Конфа построена так чтобы как можно больше облегчить работу пользователей с сохранением типового механизма работы, ежедневно центральный склад получает товара от 10 000 до 20 000 единиц товара (все это нужно правильно принять, отштрихкодировать и отправить на аптеки по их заказам). Большая часть документов формируется автоматом ночью: анализируются заказы и остатки аптек, рассылаются заказы поставщикам, обрабатываются присланные поставщиками приходные в электронном виде + все причуды фармацевтического бизнеса. И это лишь участок заказов и приемки товара.
Повторюсь я не в силах описать всё. Весь механизм приемки построен на специализированных АРМах и дополнительных регистрах, с помощью которых создаются, редактируются типовые документы.

Автор: sergefox 02.08.09, 20:41

Еще раз.
Предлагаемый реквизит в документе Перемещение используется только при программном формировании документа в твоей обработке.
Нигде больше он не проявляется и в форме его не видно.
Поэтому никакая тетя не сможет его изменить.
Значение по умолчанию - всегда Ложь, кроме этой конкретной обработки.
Поэтому при прочих обработках - Последовательность, групповое перепроведение документов он будет проводиться с этим значением.
И только там, где ты напишешь при создании документа
Реквизит = Истина;
будет измененная обработка проведения.

Автор: Fynjy 03.08.09, 8:27

ДокументОбъект.<Имя документа>.ДополнительныеСвойства (DocumentObject.<Имя документа>.AdditionalProperties)
ДокументОбъект.<Имя документа> (DocumentObject.<Имя документа>)
ДополнительныеСвойства (AdditionalProperties)
Использование:
Только чтение.
Описание:
Тип: Структура. Может использоваться в тех случаях, когда необходимо хранить некоторые значения, связанные с объектом, на время выполнения некоторых операций, без изменения объекта. Например, при обработке событий в подписке на события.
XML-сериализация.

Автор: Batchir 03.08.09, 8:56

Цитата(sergefox @ 02.08.09, 21:41) *
Еще раз.
Предлагаемый реквизит в документе Перемещение используется только при программном формировании документа в твоей обработке.
Нигде больше он не проявляется и в форме его не видно.
Поэтому никакая тетя не сможет его изменить.
Значение по умолчанию - всегда Ложь, кроме этой конкретной обработки.
Поэтому при прочих обработках - Последовательность, групповое перепроведение документов он будет проводиться с этим значением.
И только там, где ты напишешь при создании документа
Реквизит = Истина;
будет измененная обработка проведения.


И в созданных програмно документах он всегда будет истина, правильно? И дальнейшое проведение таких документов сообщений не покажет, правильно?

Автор: Batchir 03.08.09, 8:59

Цитата(Fynjy @ 03.08.09, 9:27) *
ДокументОбъект.<Имя документа>.ДополнительныеСвойства (DocumentObject.<Имя документа>.AdditionalProperties)
ДокументОбъект.<Имя документа> (DocumentObject.<Имя документа>)
ДополнительныеСвойства (AdditionalProperties)
Использование:
Только чтение.
Описание:
Тип: Структура. Может использоваться в тех случаях, когда необходимо хранить некоторые значения, связанные с объектом, на время выполнения некоторых операций, без изменения объекта. Например, при обработке событий в подписке на события.
XML-сериализация.

А вот этого не знал, спс

Автор: Fynjy 03.08.09, 12:10

Век живи, век учись и дураком помрешь smile.gif

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua