Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

Создание подписки на событие

Создание подписки на событие
Я
   Иванов Иван Иваныч
 
15.01.19 - 08:53
Уважаемые форумчане, помогите пожалуйста новичку с созданием подписки! Ситуация такова: есть регистр сведений "УчетнаяПолитикаНалоговыйУчет", в нем ресурс "ОрганизацияЯвляетсяПлательщикомНДС"; рабочий документ "РеализацияТоваровУслуг", в нем реквизит "СтавкаНДС" (СправочникСсылка.СтавкиНДС), который находится в ТЧ "Товары"; общая форма "ФормаЦеныИВалюта", в "ФормаЦеныИВалюта" есть реквизит типа Булево "УчитыватьНДС"; общий модуль "_ПроверкаНДС" и собственно сама подписка "_ПроверкаНДС" (ДокументОбъект.РеализацияТоваровУслуг). Параметры общего модуля: Клиент, Сервер, Внешнее соединение и Вызов сервера. Событие подписки: ОбработкаПроведения, обработчик: ОбработкаТабличныхЧастей._ПроверкаНДСОбработкаПроведения. Необходимо создать запрос в регистр сведений с проверкой, является ли организация на текущую дату плательщиком НДС, и если организация является плательщиком НДС, тогда проверить в общей форме ФормаЦеныИВалюта, чтоб стояла галочка на реквизите УчитыватьНДС (если не стоит, то включить), затем в ТЧ документа, нужна проверка чтоб реквизит СтавкаНДС был 12%, если Ложь, тогда проверка чтоб галочка в реквизите УчитыватьНДС не стояла (если стоит - отключить). На текущий момент имею код проверки реквизита СтавкаНДС, в котором я не уверен. Проблема в том, что окончательное ТЗ получил только что, закончить нужно сегодня и моих знаний попросту не хватит на то чтобы успеть... Помогите пожалуйста!
Работаю в конфигурации 8.3.9.2033

Код (записан в общем модуле _ПроверкаНДС):
Процедура _ПроверкаНДСОбработкаПроведения(Источник, Отказ, РежимПроведения) Экспорт
    Если Источник.Товары.СтавкаНДС <> "12%" Тогда
        Отказ = Истина;
        Сообщить("Проверьте заполнение данных!");
    КонецЕсли;
КонецПроцедуры
 
 
   MrCoffin
 
1 - 15.01.19 - 09:11
Твой код нужно исправить так:
Процедура _ПроверкаНДСОбработкаПроведения(Источник, Отказ, РежимПроведения) Экспорт
ТЗ=РегистрыСведений.УчетнаяПолитикаНалоговыйУчет.СрезПоследних(Источник.Дата);//Здесь получишь таблицу значений на конец периода Источник.Дата, можешь из неё взять значение ставки ндс (это правильно), а можешь сделать как на следующей строчке (это относительно правильно).

ПравильнаяСтавка=Справочники.СтавкиНДС.НайтиПоНаименованию("Ставка 12%")//Здесь догадаешься вставить поиск как правильно у тебя они учитываются.

    Для Каждого Стр Из Источник.Товары Цикл
        Если Стр.СтавкаНДС <> ПравильнаяСтавка Тогда
            Отказ = Истина;
            Сообщить("Проверьте заполнение данных в строке "+(Стр.НомерСтроки+1));
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры
   MrCoffin
 
2 - 15.01.19 - 09:17
(1) "(Стр.НомерСтроки+1)" - это не надо, с индексом перепутал.
   Иванов Иван Иваныч
 
3 - 15.01.19 - 09:38
(2) Т.е. итоговый код такой?:

&НаСервере
Процедура _ПроверкаНДСОбработкаПроведения(Источник, Отказ, РежимПроведения) Экспорт
    ТЗ=РегистрыСведений.УчетнаяПолитикаНалоговыйУчет.СрезПоследних(Источник.Дата);
    ПравильнаяСтавка=Справочники.СтавкиНДС.НайтиПоНаименованию("12%");
    Для Каждого Стр Из Источник.Товары Цикл
        Если Стр.СтавкаНДС <> ПравильнаяСтавка Тогда
            Отказ = Истина;
            Сообщить("Проверьте заполнение данных в строке Ставка НДС");
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры


&НаСервере написал т.к. вываливались ерроры на Справочники и РегистрыСведений.
Получается запрос через конструктор делать не нужно?
   hhhh
 
4 - 15.01.19 - 09:43
(3) нет, это не итоговый. Это тебя пнули в нужном направлении.
   13_Mult
 
5 - 15.01.19 - 09:43
(1) (3) А зачем вам здесь срез по регистру сведений?
   hhhh
 
6 - 15.01.19 - 09:48
(5) ну вроде в вопросе
"есть регистр сведений "УчетнаяПолитикаНалоговыйУчет", в нем ресурс "ОрганизацияЯвляетсяПлательщикомНДС""
   13_Mult
 
7 - 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) можно пожалуйста как для дауна на пальцах?
 
 Рекламное место пустует
   hhhh
 
11 - 15.01.19 - 10:03
(10) ну вы говорите, что не так, мы подправим.Что значит на пальцах не на пальцах, хрен вас поймешь.
   MrCoffin
 
12 - 15.01.19 - 10:10
(10)
&НаСервере
Процедура _ПроверкаНДСОбработкаПроведения(Источник, Отказ, РежимПроведения) Экспорт
    ТЗ=РегистрыСведений.УчетнаяПолитикаНалоговыйУчет.СрезПоследних(Источник.Дата);
//ТЗ - таблица значений, содержит в себе значения настроек на дату документа. Допустим, у тебя есть эти настройки и в таблице есть хотя бы одна строка, тогда:

Если Не ТЗ[0].ОрганизацияЯвляетсяПлательщикомНДС Тогда
//этот реквизит установлен в ложь и тогда значение НДС не проверяем

Возврат;
КонецЕсли;
//а если реквизит установлен в истина, тогда идем дальше по процедуре и проверяем.

ПравильнаяСтавка=ТЗ[0].ТекущаяСтавкаНДСОрганизацииИзУчетнойПолитики;//у тебя реквизит называется иначе или его может не быть

//Получение из справочника ниже - это пример.    ПравильнаяСтавка=Справочники.СтавкиНДС.НайтиПоНаименованию("12%");
//Должна быть одна строка: из справочника или из регистра

    Для Каждого Стр Из Источник.Товары Цикл
        Если Стр.СтавкаНДС <> ПравильнаяСтавка Тогда
            Отказ = Истина;
            Сообщить("Проверьте заполнение данных в строке Ставка НДС");
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры

Запрос не напишу, я не знаю, что у тебя за конфигурация, где ставки НДС в справочнике. Через срез последних - простейший вариант, в данном случае работать будет достаточно быстро.
Попробуй сформулировать свою задачу без упоминания общей формы и рассказав названия всех реквизитов регистров откуда берутся настройки и реквизитов справочника НДС.
   singlych
 
13 - 15.01.19 - 10:17
Вообще, логичнее проверку заполнения делать в обработке проверки заполнения.
Еще подкину, что УчитыватьНДС это, скорее всего, реквизит документа, и если его нужно изменять, то это делать надо перед записью. И там, видимо, суммы пересчитывать надо при переключении.
   Иванов Иван Иваныч
 
14 - 15.01.19 - 10:21
(12) Необходимо создать запрос в регистр сведений с проверкой, является ли организация на текущую дату плательщиком НДС, и если организация является плательщиком НДС, тогда проверить в ТЧ документа чтоб реквизит СтавкаНДС был 12%, если не является, то ничего не делать.
Это мне ТЗ поправили
Регистр: УчетнаяПолитикаНалоговыйУчет.Ресурсы.ОрганизацияЯвляетсяПлательщикомНДС
Справочник: СтавкиНДС.Реквизиты.Ставка
   Иванов Иван Иваныч
 
15 - 15.01.19 - 10:21
(13) суммы автоматически пересчитываются при переключении флажка
   singlych
 
16 - 15.01.19 - 10:25
(15) ага, и кто его будет переключать?
   Иванов Иван Иваныч
 
17 - 15.01.19 - 10:26
(12) ПравильнаяСтавка=ТЗ[0].ТекущаяСтавкаНДСОрганизацииИзУчетнойПолитики//у тебя реквизит называется иначе или его может не быть 


нету
   Иванов Иван Иваныч
 
18 - 15.01.19 - 10:27
(16) тот, кто будет забивать документ Реализация
   singlych
 
19 - 15.01.19 - 10:30
(18) Ну тогда забей, а то в (0) написано так, как будто это нужно делать программно.
   Иванов Иван Иваныч
 
20 - 15.01.19 - 10:30
(12) и можно сразу вопрос, почему после ТЗ [0] написан?
   Иванов Иван Иваныч
 
21 - 15.01.19 - 10:30
(19) да, уже переформулировали:  Необходимо создать запрос в регистр сведений с проверкой, является ли организация на текущую дату плательщиком НДС, и если организация является плательщиком НДС, тогда проверить в ТЧ документа чтоб реквизит СтавкаНДС был 12%, если не является, то ничего не делать.
Это мне ТЗ поправили
   singlych
 
22 - 15.01.19 - 10:36
(20) Потому что ТЗ - это таблица значений, в которой может быть много строк. [0] это обращение к первой строке. Так скажем, сделана скидка на то, что организация только одна, и по ней заполнена учетная политика. По хорошему, записей может не быть, и записей может быть больше одной, если есть несколько организаций, это надо тоже учитывать.
   Иванов Иван Иваныч
 
23 - 15.01.19 - 10:42
(22) по сути первый элемент массива, состоящий из всех строк ТЗ? Да, организация одна
   MrCoffin
 
24 - 15.01.19 - 10:56
(23) Про ТЗ тебе уже пояснили.
Новый вариант:
&НаСервере
Процедура _ПроверкаНДСОбработкаПроведения(Источник, Отказ, РежимПроведения) Экспорт
    ТЗ=РегистрыСведений.УчетнаяПолитикаНалоговыйУчет.СрезПоследних(Источник.Дата);
Если ТЗ.Количество()=0 Тогда
    Сообщить("Учетная политика не установлена. Проверить ставку НДС не получится.");
    Возврат;
КонецЕсли;
Если Не ТЗ[0].ОрганизацияЯвляетсяПлательщикомНДС Тогда
//этот реквизит установлен в ложь и тогда значение НДС не проверяем


    Возврат;
КонецЕсли;

ПравильнаяСтавка=Справочники.СтавкиНДС.НайтиПоНаименованию("12%");
//Должна быть одна строка: из справочника или из регистра


    Для Каждого Стр Из Источник.Товары Цикл
        Если Стр.СтавкаНДС <> ПравильнаяСтавка Тогда
            Отказ = Истина;
            Сообщить("Проверьте заполнение данных в строке Ставка НДС");
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры

Открой синтакспомощник и прочитай про "СрезПоследних". Вторым параметром можно подставить структуру отбора по реквизитам, но если организация одна, то это не потребуется, пока их не станет больше.
И почему проверка только на 12%, а если вы завтра перейдете на 10, а послезавтра на 20%, а через полгода станет как было в начале? Текущая ставка НДС, скорее всего, хранится в учетной политике.
   Иванов Иван Иваныч
 
25 - 15.01.19 - 11:18
(24) ставка строго 12%, потому что так надо)
   catena
 
26 - 15.01.19 - 11:29
"Текущая ставка НДС, скорее всего, хранится в учетной политике." - сомневаюсь, хоть конфигурация и не озвучена, но судя по ставке это КЗ, а у нас ставка не менялась очень давно.
   catena
 
27 - 15.01.19 - 11:30
Поэтому, повода пихать ее в учетную политику не было :)
   Иванов Иван Иваныч
 
28 - 15.01.19 - 11:35
(26) да, КЗ, забыл написать
   MrCoffin
 
29 - 15.01.19 - 12:02
(28) Что такое "КЗ"?
Тогда вариант в (24) окончательный, добавь в
Сообщить("Проверьте заполнение данных в строке Ставка НДС в строке "+Стр.НомерСтроки);
номер строки, чтобы понятно было где ошибка.
   Иванов Иван Иваныч
 
30 - 15.01.19 - 12:19
(29) Казахстан
   Иванов Иван Иваныч
 
31 - 15.01.19 - 12:20
(29) Большое спасибо! Всё работает. Спасли меня буквально!


Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Рекламное место пустует