Имя: Пароль:
1C
Обучение
Помогите написать условие в документе
0 yellowbox
 
13.07.23
08:46
Имеется  справочник договор; документы условия договора(прикреплен к договору) и поставка. В условии договора указывается склады на которые поставляются товары, надо при поставке(там указывается договор и склад, при выборе склада, чтобы ошибка выходила, если данный склад не указан в условии договора.
1 Волшебник
 
13.07.23
08:51
Задание на собеседовании?
2 yellowbox
 
13.07.23
09:14
(1) Нет, на работе, невнимательно работают,могут не то добавить,потом куча ошибок,надо чтобы ошибку выдавало(контролировало),если склад указывался бы в договоре,было бы проще,но склад в документе условия договора. Работать пришла после теха,не знаю как лучше написать.
есть вот такая фигня только

    // Получаем ссылку на договор из документа поставки
    СсылкаНаДоговор = Объект.Договор;
    
    // Получаем список складов из условий договора
    СправочникСкладов = СсылкаНаДоговор.УсловияДоговора.СписокСкладов;
    
    // Получаем склад, выбранный при поставке
    СсылкаНаСклад = ДокументОбъект.Склад;
    
    // Проверяем, что выбранный склад есть в списке складов условий договора
    ЕстьСклад = Ложь;
    Для Каждого Склад Из СправочникСкладов Цикл
        Если Склад = СсылкаНаСклад Тогда
            ЕстьСклад = Истина;
        КонецЕсли;
    КонецЦикла;
    
    // Если выбранный склад не указан в условиях договора, выводим сообщение об ошибке
    Если Не ЕстьСклад Тогда
        Сообщить("Выбранный склад не указан в условиях договора!");
        Отказ = Истина;
    КонецЕсли;
3 Галахад
 
13.07.23
09:20
(2) Эта "фигня" не работает? Или ищется более "правильное" решение?
4 yellowbox
 
13.07.23
09:24
(3) не работает
5 Ногаминебить
 
13.07.23
09:27
СсылкаНаДоговор.УсловияДоговора.СписокСкладов - тут какой тип значения?
6 yellowbox
 
13.07.23
09:28
Список складов является табличной частью документа условия договора, договор - справочник
7 Ногаминебить
 
13.07.23
09:31
(6) Тогда заменяем
"Если Склад = СсылкаНаСклад Тогда"
на
"Если Склад.КакТамНазываетсяРеквизитТабличнойЧастиГдеСклад = СсылкаНаСклад Тогда"

Это чисто чтоб посмотреть что работает. Но потом все равно переписываем этот код к чертовой матери. :)
8 yellowbox
 
13.07.23
09:47
(7) все равно проводит с любым складом
9 Ногаминебить
 
13.07.23
09:52
Под отладкой посмотреть. Попадает ли туда, что выполняется, какие значения в переменных?
Кусочек кода из какой процедуры кстати?
10 yellowbox
 
13.07.23
09:55
Процедура ПередЗаписью (9)
11 Галахад
 
13.07.23
10:04
Вроде должно работать. Единственное, что такое ДокументОбъект?
СсылкаНаСклад = ДокументОбъект.Склад
12 uPstart_
 
13.07.23
10:05
(2) Можно весь код переписать проще используя структуру поиска. Необходимо вставить весь код в конце процедуры ПередЗаписью.
13 yellowbox
 
13.07.23
10:42
(11) Ошибка,Изменила на объект
// Получаем ссылку на договор из документа поставки
    СсылкаНаДоговор = Объект.Договор;
    
    // Получаем список складов из условий договора
    СправочникСкладов = СсылкаНаДоговор.УсловияДоговора.Склады;
    
    // Получаем склад, выбранный при поставке
    СсылкаНаСклад = Объект.Склад;
    
    // Проверяем, что выбранный склад есть в списке складов условий договора
    ЕстьСклад = Ложь;
    Для Каждого Склад Из СправочникСкладов Цикл
        Если Склад
            = СсылкаНаСклад Тогда
            ЕстьСклад = Истина;
        КонецЕсли;
    КонецЦикла;
    
    // Если выбранный склад не указан в условиях договора, выводим сообщение об ошибке
    Если Не ЕстьСклад Тогда
        Сообщить("Выбранный склад не указан в условиях договора!");
        Отказ = Истина;
    КонецЕсли;
14 Буковка
 
13.07.23
10:46
(0) а где вы пишите код? может, по условию добавить в проверяемые реквизиты в модуле объекта?
15 yellowbox
 
13.07.23
10:48
форма документа, Процедура ПередЗаписью.
16 yellowbox
 
13.07.23
10:50
Ошибок никаких не выдает, при отладке все равно проводит со всеми складами.
17 Буковка
 
13.07.23
10:52
(16) посмотрите Процедуру ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты) в модуде объекта документа и добавьте в проверяемые реквизиты по условию
18 Галахад
 
13.07.23
10:56
(15) Процедуру сами делали? Она привязана к событиям формы?
19 Мультук
 
13.07.23
11:13
(15)

Покажите код процедуры ПОЛНОСТЬЮ
20 yellowbox
 
13.07.23
11:18
Процедура уже была, к событиям привязана
вот вся
&НаКлиенте
Процедура ПередЗаписью(Отказ, ПараметрыЗаписи)    
    
    
    Если НЕ Питание_НаКлиенте.ПередЗаписьюФормыДокумента(ЭтаФорма, ПараметрыЗаписи.РежимЗаписи) Тогда
        Отказ = Истина;
        Возврат;
    КонецЕсли;
    
    Если ТипЗнч(ПараметрыЗаписи) = Тип("Структура") И ПараметрыЗаписи.Свойство("Принудительно") И ПараметрыЗаписи.Принудительно = Истина Тогда
        Возврат;    
    КонецЕсли;
    
    Если Объект.СуммаДокумента <> Объект.Продукты.Итог("Всего") и ПараметрыЗаписи.РежимЗаписи = РежимЗаписиДокумента.Проведение Тогда
        Отказ = Истина;
        МассивКнопок = Новый СписокЗначений;
        МассивКнопок.Добавить("Продолжить", "Установить и продолжить");
        МассивКнопок.Добавить("Отмена", "Отмена");
        ДополнительныеПараметры = Новый Структура("ПараметрыЗаписи", ПараметрыЗаписи);
        ОписаниеОповещения = Новый ОписаниеОповещения("ПередЗаписьюПриЗакрытииВопросСуммыЗавершение", ЭтотОбъект, ДополнительныеПараметры);
        Текст = "Сумма документа = %1, а сумма строк = %2";
        Текст = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(Текст, Объект.СуммаДокумента, Объект.Продукты.Итог("Всего"));
        ПоказатьВопрос(ОписаниеОповещения, Текст, МассивКнопок);
    КонецЕсли;  

    СсылкаНаДоговор = Объект.Договор;

    СписокСкладов = СсылкаНаДоговор.УсловияДоговора.Склады;

    СсылкаНаСклад = Объект.Склад;

    ЕстьСклад = Ложь;
    Для Каждого Склад Из СписокСкладов Цикл
        Если Склад
            = СсылкаНаСклад Тогда
            ЕстьСклад = Истина;
        КонецЕсли;
    КонецЦикла;

    Если Не ЕстьСклад Тогда
        Сообщить("Выбранный склад не указан в условиях договора!");
        Отказ = Истина;
    КонецЕсли;



КонецПроцедуры
21 Мультук
 
13.07.23
11:18
(16)

При отладке вы попадете вообще в свой код ?
Вы ставите на свой код точки остановка (красные) ?
Вы жмете F10 ?
Вы видите сообщение "Выбранный склад не указан в условиях договора!" ?
Вы видите в табло что переменная Отказ была сначала ЛОЖЬ, а затем приняла значение Истина


P.S.
Коллеги (мальчики/девочки) на работе есть ?
Или вы одна ?
Вам после техникума нужно в коллектив, набираться уму-разуму
22 yellowbox
 
13.07.23
11:21
Работаю одна, сижу в бухгалтерии, больше никого(в техе по коду вообще не учили, с методичек в лабы копировали коды,понять все достаточно сложно(
23 Мультук
 
13.07.23
11:21
(20)

>> Если НЕ Питание_НаКлиенте.ПередЗаписьюФормыДокумента(ЭтаФорма, ПараметрыЗаписи.РежимЗаписи) Тогда

Ставим вот на эту строчку точку останова и жмем F10 и смотри "а что же происходит" ?
Доходит ли выполнение до вашего кода вообще
24 Aleksandr N
 
13.07.23
11:52
(20) Простите, а вы умеете пользоваться отладчиком?
25 yellowbox
 
13.07.23
13:40
Отладчик не работает, по шагам не проходит, шаги в меню отладки недоступны.  Сообщение не высвечивается, что код есть, что нет, проводит все.
26 Мультук
 
13.07.23
14:01
(25)

1) Дописываем "ура". Сохраняем/проводим документ БЕЗ закрытия формы
"Ура" появилось в сообещниях

&НаКлиенте
Процедура ПередЗаписью(Отказ, ПараметрыЗаписи)    

     Сообщить("Ура!");
    
2)

Я не знаю чему вас учили в вашем кулинарном техникуме, но в процедуре на &НаКлиенте
вот эта строка должна вызвать ошибку. Ибо так можно делать только в функциях/процедурах "&НаСервере" и "&НаСерверБезКонтекста"

СписокСкладов = СсылкаНаДоговор.УсловияДоговора.Склады;

3)
Как пользоваться отладчиком

https://www.youtube.com/watch?v=jbJ1B1r_b80
https://www.youtube.com/watch?v=aYXnxQf7ies
27 yellowbox
 
17.07.23
10:17
Дописала так, через отладчик ошибок нет. Теперь каждый раз выдает сообщение "Выбранный склад не указан в условиях договора!, даже если склад указан.
&НаКлиенте
Процедура ПередЗаписью(Отказ, ПараметрыЗаписи)
    Если НЕ Питание_НаКлиенте.ПередЗаписьюФормыДокумента(ЭтаФорма, ПараметрыЗаписи.РежимЗаписи) Тогда
        Отказ = Истина;
        Возврат;
    КонецЕсли;
    
    Если ТипЗнч(ПараметрыЗаписи) = Тип("Структура") И ПараметрыЗаписи.Свойство("Принудительно") И ПараметрыЗаписи.Принудительно = Истина Тогда
        Возврат;    
    КонецЕсли;
    
    Если Объект.СуммаДокумента <> Объект.Продукты.Итог("Всего") и ПараметрыЗаписи.РежимЗаписи = РежимЗаписиДокумента.Проведение Тогда
        Отказ = Истина;
        МассивКнопок = Новый СписокЗначений;
        МассивКнопок.Добавить("Продолжить", "Установить и продолжить");
        МассивКнопок.Добавить("Отмена", "Отмена");
        ДополнительныеПараметры = Новый Структура("ПараметрыЗаписи", ПараметрыЗаписи);
        ОписаниеОповещения = Новый ОписаниеОповещения("ПередЗаписьюПриЗакрытииВопросСуммыЗавершение", ЭтотОбъект, ДополнительныеПараметры);
        Текст = "Сумма документа = %1, а сумма строк = %2";
        Текст = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(Текст, Объект.СуммаДокумента, Объект.Продукты.Итог("Всего"));
        ПоказатьВопрос(ОписаниеОповещения, Текст, МассивКнопок);
    КонецЕсли;  
           ККТ = Объект;
           Поставка (Отказ, ККТ);
КонецПроцедуры

&НаСервере
Процедура Поставка (Отказ, Объект)
          // Получаем ссылку на договор из документа поставки
    СсылкаНаДоговор = Объект.УсловиеДоговора;
    
    // Получаем список складов из условий договора
    СправочникСкладов = СсылкаНаДоговор.Склады;  
        
    // Получаем склад, выбранный при поставке
    СсылкаНаСклад = Объект.Склад;
    
    // Проверяем, что выбранный склад есть в списке складов условий договора
    ЕстьСклад = Ложь;
    Для Каждого Склад Из СправочникСкладов Цикл
        Если Склад
            = СсылкаНаСклад Тогда
            ЕстьСклад = Истина;
        КонецЕсли;
    КонецЦикла;
    
    // Если выбранный склад не указан в условиях договора, выводим сообщение об ошибке
    Если Не ЕстьСклад Тогда
        Сообщить("Выбранный склад не указан в условиях договора!");
        Отказ = Истина;
    КонецЕсли
    
КонецПроцедуры (26)
28 yellowbox
 
17.07.23
10:19
На форму добавила поле ввода условия договора, т.к. склад указывается в нем и по договору может быть несколько условий.
29 yellowbox
 
17.07.23
10:39
Все решила, работает, всем спасибо. Если не сложно, посоветуйте какие источники лучше для изучения 1С.
За сообщения про отладчик отдельное спасибо)))))
// Проверяем, что выбранный склад есть в списке складов условий договора
    ЕстьСклад = Ложь;
    Для Каждого Склад Из СправочникСкладов Цикл
        Если Склад.СКЛАД
            = СсылкаНаСклад Тогда
            ЕстьСклад = Истина;
        КонецЕсли;
    КонецЦикла;