Имя: Пароль:
1C
1С v8
Создание подписки на событие
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) Большое спасибо! Всё работает. Спасли меня буквально!
Компьютер — устройство, разработанное для ускорения и автоматизации человеческих ошибок.