| 
    
        
     
     | 
    
  | 
Создание подписки на событие | ☑ | ||
|---|---|---|---|---|
| 
    0
    
        Иванов Иван Иваныч    
     15.01.19 
            ✎
    08:53 
 | 
         
        Уважаемые форумчане, помогите пожалуйста новичку с созданием подписки! Ситуация такова: есть регистр сведений "УчетнаяПолитикаНалоговыйУчет", в нем ресурс "ОрганизацияЯвляетсяПлательщикомНДС"; рабочий документ "РеализацияТоваровУслуг", в нем реквизит "СтавкаНДС" (СправочникСсылка.СтавкиНДС), который находится в ТЧ "Товары"; общая форма "ФормаЦеныИВалюта", в "ФормаЦеныИВалюта" есть реквизит типа Булево "УчитыватьНДС"; общий модуль "_ПроверкаНДС" и собственно сама подписка "_ПроверкаНДС" (ДокументОбъект.РеализацияТоваровУслуг). Параметры общего модуля: Клиент, Сервер, Внешнее соединение и Вызов сервера. Событие подписки: ОбработкаПроведения, обработчик: ОбработкаТабличныхЧастей._ПроверкаНДСОбработкаПроведения. Необходимо создать запрос в регистр сведений с проверкой, является ли организация на текущую дату плательщиком НДС, и если организация является плательщиком НДС, тогда проверить в общей форме ФормаЦеныИВалюта, чтоб стояла галочка на реквизите УчитыватьНДС (если не стоит, то включить), затем в ТЧ документа, нужна проверка чтоб реквизит СтавкаНДС был 12%, если Ложь, тогда проверка чтоб галочка в реквизите УчитыватьНДС не стояла (если стоит - отключить). На текущий момент имею код проверки реквизита СтавкаНДС, в котором я не уверен. Проблема в том, что окончательное ТЗ получил только что, закончить нужно сегодня и моих знаний попросту не хватит на то чтобы успеть... Помогите пожалуйста!
 
        Работаю в конфигурации 8.3.9.2033 Код (записан в общем модуле _ПроверкаНДС): Процедура _ПроверкаНДСОбработкаПроведения(Источник, Отказ, РежимПроведения) Экспорт Если Источник.Товары.СтавкаНДС <> "12%" Тогда Отказ = Истина; Сообщить("Проверьте заполнение данных!"); КонецЕсли; КонецПроцедуры  | 
|||
| 
    1
    
        MrCoffin    
     15.01.19 
            ✎
    09:11 
 | 
         
        Твой код нужно исправить так:
 
        Процедура _ПроверкаНДСОбработкаПроведения(Источник, Отказ, РежимПроведения) Экспорт ТЗ=РегистрыСведений.УчетнаяПолитикаНалоговыйУчет.СрезПоследних(Источник.Дата); //Здесь получишь таблицу значений на конец периода Источник.Дата, можешь из неё взять значение ставки ндс (это правильно), а можешь сделать как на следующей строчке (это относительно правильно). ПравильнаяСтавка=Справочники.СтавкиНДС.НайтиПоНаименованию("Ставка 12%");//Здесь догадаешься вставить поиск как правильно у тебя они учитываются. Для Каждого Стр Из Источник.Товары Цикл Если Стр.СтавкаНДС <> ПравильнаяСтавка Тогда Отказ = Истина; Сообщить("Проверьте заполнение данных в строке "+(Стр.НомерСтроки+1)); КонецЕсли; КонецЦикла; КонецПроцедуры  | 
|||
| 
    2
    
        MrCoffin    
     15.01.19 
            ✎
    09:17 
 | 
         
        (1) "(Стр.НомерСтроки+1)" - это не надо, с индексом перепутал.     
         | 
|||
| 
    3
    
        Иванов Иван Иваныч    
     15.01.19 
            ✎
    09:38 
 | 
         
        (2) Т.е. итоговый код такой?:
 
        &НаСервере Процедура _ПроверкаНДСОбработкаПроведения(Источник, Отказ, РежимПроведения) Экспорт ТЗ=РегистрыСведений.УчетнаяПолитикаНалоговыйУчет.СрезПоследних(Источник.Дата); ПравильнаяСтавка=Справочники.СтавкиНДС.НайтиПоНаименованию("12%"); Для Каждого Стр Из Источник.Товары Цикл Если Стр.СтавкаНДС <> ПравильнаяСтавка Тогда Отказ = Истина; Сообщить("Проверьте заполнение данных в строке Ставка НДС"); КонецЕсли; КонецЦикла; КонецПроцедуры &НаСервере написал т.к. вываливались ерроры на Справочники и РегистрыСведений. Получается запрос через конструктор делать не нужно?  | 
|||
| 
    4
    
        hhhh    
     15.01.19 
            ✎
    09:43 
 | 
         
        (3) нет, это не итоговый. Это тебя пнули в нужном направлении.     
         | 
|||
| 
    5
    
        13_Mult    
     15.01.19 
            ✎
    09:43 
 | 
         
        (1) (3) А зачем вам здесь срез по регистру сведений?     
         | 
|||
| 
    6
    
        hhhh    
     15.01.19 
            ✎
    09:48 
 | 
         
        (5) ну вроде в вопросе
 
        "есть регистр сведений "УчетнаяПолитикаНалоговыйУчет", в нем ресурс "ОрганизацияЯвляетсяПлательщикомНДС""  | 
|||
| 
    7
    
        13_Mult    
     15.01.19 
            ✎
    09:54 
 | 
         
        (6) А что произойдёт со всеми манипуляциями при Отказ = Истина в обработке проведения?     
         | 
|||
| 
    8
    
        Иванов Иван Иваныч    
     15.01.19 
            ✎
    09:56 
 | 
         
        (7) ну по сути если не соответствует условию (т.е. НДС не 12%), тогда документ не проводится и выводится сообщение юзеру, чтоб проверил реквизит     
         | 
|||
| 
    9
    
        Иванов Иван Иваныч    
     15.01.19 
            ✎
    09:57 
 | 
         
        (4) если честно, пока что сложно...     
         | 
|||
| 
    10
    
        Иванов Иван Иваныч    
     15.01.19 
            ✎
    09:59 
 | 
         
        (4) можно пожалуйста как для дауна на пальцах?     
         | 
|||
| 
    11
    
        hhhh    
     15.01.19 
            ✎
    10:03 
 | 
         
        (10) ну вы говорите, что не так, мы подправим.Что значит на пальцах не на пальцах, хрен вас поймешь.     
         | 
|||
| 
    12
    
        MrCoffin    
     15.01.19 
            ✎
    10:10 
 | 
         
        (10) 
 
        &НаСервере Процедура _ПроверкаНДСОбработкаПроведения(Источник, Отказ, РежимПроведения) Экспорт ТЗ=РегистрыСведений.УчетнаяПолитикаНалоговыйУчет.СрезПоследних(Источник.Дата); //ТЗ - таблица значений, содержит в себе значения настроек на дату документа. Допустим, у тебя есть эти настройки и в таблице есть хотя бы одна строка, тогда: Если Не ТЗ[0].ОрганизацияЯвляетсяПлательщикомНДС Тогда //этот реквизит установлен в ложь и тогда значение НДС не проверяем Возврат; КонецЕсли; //а если реквизит установлен в истина, тогда идем дальше по процедуре и проверяем. ПравильнаяСтавка=ТЗ[0].ТекущаяСтавкаНДСОрганизацииИзУчетнойПолитики; //у тебя реквизит называется иначе или его может не быть //Получение из справочника ниже - это пример. ПравильнаяСтавка=Справочники.СтавкиНДС.НайтиПоНаименованию("12%"); //Должна быть одна строка: из справочника или из регистра Для Каждого Стр Из Источник.Товары Цикл Если Стр.СтавкаНДС <> ПравильнаяСтавка Тогда Отказ = Истина; Сообщить("Проверьте заполнение данных в строке Ставка НДС"); КонецЕсли; КонецЦикла; КонецПроцедуры Запрос не напишу, я не знаю, что у тебя за конфигурация, где ставки НДС в справочнике. Через срез последних - простейший вариант, в данном случае работать будет достаточно быстро. Попробуй сформулировать свою задачу без упоминания общей формы и рассказав названия всех реквизитов регистров откуда берутся настройки и реквизитов справочника НДС.  | 
|||
| 
    13
    
        singlych    
     15.01.19 
            ✎
    10:17 
 | 
         
        Вообще, логичнее проверку заполнения делать в обработке проверки заполнения.
 
        Еще подкину, что УчитыватьНДС это, скорее всего, реквизит документа, и если его нужно изменять, то это делать надо перед записью. И там, видимо, суммы пересчитывать надо при переключении.  | 
|||
| 
    14
    
        Иванов Иван Иваныч    
     15.01.19 
            ✎
    10:21 
 | 
         
        (12) Необходимо создать запрос в регистр сведений с проверкой, является ли организация на текущую дату плательщиком НДС, и если организация является плательщиком НДС, тогда проверить в ТЧ документа чтоб реквизит СтавкаНДС был 12%, если не является, то ничего не делать.
 
        Это мне ТЗ поправили Регистр: УчетнаяПолитикаНалоговыйУчет.Ресурсы.ОрганизацияЯвляетсяПлательщикомНДС Справочник: СтавкиНДС.Реквизиты.Ставка  | 
|||
| 
    15
    
        Иванов Иван Иваныч    
     15.01.19 
            ✎
    10:21 
 | 
         
        (13) суммы автоматически пересчитываются при переключении флажка     
         | 
|||
| 
    16
    
        singlych    
     15.01.19 
            ✎
    10:25 
 | 
         
        (15) ага, и кто его будет переключать?     
         | 
|||
| 
    17
    
        Иванов Иван Иваныч    
     15.01.19 
            ✎
    10:26 
 | 
         
        (12) ПравильнаяСтавка=ТЗ[0].ТекущаяСтавкаНДСОрганизацииИзУчетнойПолитики;//у тебя реквизит называется иначе или его может не быть 
 
        нету  | 
|||
| 
    18
    
        Иванов Иван Иваныч    
     15.01.19 
            ✎
    10:27 
 | 
         
        (16) тот, кто будет забивать документ Реализация     
         | 
|||
| 
    19
    
        singlych    
     15.01.19 
            ✎
    10:30 
 | 
         
        (18) Ну тогда забей, а то в (0) написано так, как будто это нужно делать программно.     
         | 
|||
| 
    20
    
        Иванов Иван Иваныч    
     15.01.19 
            ✎
    10:30 
 | 
         
        (12) и можно сразу вопрос, почему после ТЗ [0] написан?     
         | 
|||
| 
    21
    
        Иванов Иван Иваныч    
     15.01.19 
            ✎
    10:30 
 | 
         
        (19) да, уже переформулировали:  Необходимо создать запрос в регистр сведений с проверкой, является ли организация на текущую дату плательщиком НДС, и если организация является плательщиком НДС, тогда проверить в ТЧ документа чтоб реквизит СтавкаНДС был 12%, если не является, то ничего не делать. 
 
        Это мне ТЗ поправили  | 
|||
| 
    22
    
        singlych    
     15.01.19 
            ✎
    10:36 
 | 
         
        (20) Потому что ТЗ - это таблица значений, в которой может быть много строк. [0] это обращение к первой строке. Так скажем, сделана скидка на то, что организация только одна, и по ней заполнена учетная политика. По хорошему, записей может не быть, и записей может быть больше одной, если есть несколько организаций, это надо тоже учитывать.     
         | 
|||
| 
    23
    
        Иванов Иван Иваныч    
     15.01.19 
            ✎
    10:42 
 | 
         
        (22) по сути первый элемент массива, состоящий из всех строк ТЗ? Да, организация одна     
         | 
|||
| 
    24
    
        MrCoffin    
     15.01.19 
            ✎
    10:56 
 | 
         
        (23) Про ТЗ тебе уже пояснили.
 
        Новый вариант: &НаСервере Процедура _ПроверкаНДСОбработкаПроведения(Источник, Отказ, РежимПроведения) Экспорт ТЗ=РегистрыСведений.УчетнаяПолитикаНалоговыйУчет.СрезПоследних(Источник.Дата); Если ТЗ.Количество()=0 Тогда Сообщить("Учетная политика не установлена. Проверить ставку НДС не получится."); Возврат; КонецЕсли; Если Не ТЗ[0].ОрганизацияЯвляетсяПлательщикомНДС Тогда //этот реквизит установлен в ложь и тогда значение НДС не проверяем Возврат; КонецЕсли; ПравильнаяСтавка=Справочники.СтавкиНДС.НайтиПоНаименованию("12%"); //Должна быть одна строка: из справочника или из регистра Для Каждого Стр Из Источник.Товары Цикл Если Стр.СтавкаНДС <> ПравильнаяСтавка Тогда Отказ = Истина; Сообщить("Проверьте заполнение данных в строке Ставка НДС"); КонецЕсли; КонецЦикла; КонецПроцедуры Открой синтакспомощник и прочитай про "СрезПоследних". Вторым параметром можно подставить структуру отбора по реквизитам, но если организация одна, то это не потребуется, пока их не станет больше. И почему проверка только на 12%, а если вы завтра перейдете на 10, а послезавтра на 20%, а через полгода станет как было в начале? Текущая ставка НДС, скорее всего, хранится в учетной политике.  | 
|||
| 
    25
    
        Иванов Иван Иваныч    
     15.01.19 
            ✎
    11:18 
 | 
         
        (24) ставка строго 12%, потому что так надо)     
         | 
|||
| 
    26
    
        catena    
     15.01.19 
            ✎
    11:29 
 | 
         
        "Текущая ставка НДС, скорее всего, хранится в учетной политике." - сомневаюсь, хоть конфигурация и не озвучена, но судя по ставке это КЗ, а у нас ставка не менялась очень давно.     
         | 
|||
| 
    27
    
        catena    
     15.01.19 
            ✎
    11:30 
 | 
         
        Поэтому, повода пихать ее в учетную политику не было :)     
         | 
|||
| 
    28
    
        Иванов Иван Иваныч    
     15.01.19 
            ✎
    11:35 
 | 
         
        (26) да, КЗ, забыл написать     
         | 
|||
| 
    29
    
        MrCoffin    
     15.01.19 
            ✎
    12:02 
 | 
         
        (28) Что такое "КЗ"?
 
        Тогда вариант в (24) окончательный, добавь в Сообщить("Проверьте заполнение данных в строке Ставка НДС в строке "+Стр.НомерСтроки); номер строки, чтобы понятно было где ошибка.  | 
|||
| 
    30
    
        Иванов Иван Иваныч    
     15.01.19 
            ✎
    12:19 
 | 
         
        (29) Казахстан     
         | 
|||
| 
    31
    
        Иванов Иван Иваныч    
     15.01.19 
            ✎
    12:20 
 | 
         
        (29) Большое спасибо! Всё работает. Спасли меня буквально!     
         | 
 | Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |