Версия для печати темы (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)
Необходимо каким-то образом передать временный параметр в документ, что бы не выдавать это сообщение, при восстановленни партий должно ругаться идти стандартным образом.
Добавить реквизит с галкой в форме "ПроводитьПартии"
В модуле ОбработкаПроведения()
УправлениеЗапасами.ДобавитьСтрокуВДеревоПолейЗапросаПоШапке(ДеревоПолейЗапросаПоШапке, "УчетнаяПолитика", "ВестиПартионныйУчетПоСкладам", "ВестиПартионныйУчетПоСкладам");
заменить на
Если ПроводитьПартии Тогда
УправлениеЗапасами.ДобавитьСтрокуВДеревоПолейЗапросаПоШапке(ДеревоПолейЗапросаПоШапке, "УчетнаяПолитика", "ВестиПартионныйУчетПоСкладам", "ВестиПартионныйУчетПоСкладам");
Иначе
УправлениеЗапасами.ДобавитьСтрокуВДеревоПолейЗапросаПоШапке(ДеревоПолейЗапросаПоШапке, "УчетнаяПолитика", "ВестиПартионныйУчетПоСкладам", Ложь);
КонецЕсли;
Правда надо как-то удостоверится что когда надо провести по партиям - галка будет действительно включена. Человеческий фактор
Автор: 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сВыводитьСообщенияОНедостачеПартий", Истина, Истина);
// ==============================
И все заработало.
З.Ы. + везде поставил
Автор: 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)
Я мало понял, что же Вы все таки там делаете
Но из того, что я понял, я бы наверное искал другое решение, возможно "людское".
Перевод крупной одесской сети аптек с уже написанной нами конфы на базе ТиС на УТ 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
Век живи, век учись и дураком помрешь
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua