Имя: Пароль:
1C
 
Не срабатывает программное изменение движений документа
0 Pahom
 
12.09.25
08:12
Стоит задача в отражении зарплаты в бухучете (Бухгалтерия 3.0) выделить начисления отпускных на отдельные статьи затрат . Типового способа нет, делать на каждое подразделение способ отражения не вариант, поэтому решил программно менять движения. После обработки проведения вставил процедуру следующего содержания:
    НаборЗаписей = РегистрыБухгалтерии.Хозрасчетный.СоздатьНаборЗаписей();
    НаборЗаписей.Отбор.Регистратор.Установить(ЭтотОбъект.Ссылка);
    НаборЗаписей.Прочитать();    
    
    Если НаборЗаписей.Количество() = 0 Тогда Возврат;
    КонецЕсли;
    
    Счет20 = ПланыСчетов.Хозрасчетный.ОсновноеПроизводство;
    Счет23 = ПланыСчетов.Хозрасчетный.ВспомогательныеПроизводства;
    Счет25 = ПланыСчетов.Хозрасчетный.ОбщепроизводственныеРасходы;
    Счет26 = ПланыСчетов.Хозрасчетный.ОбщехозяйственныеРасходы;
    Счет4401 = ПланыСчетов.Хозрасчетный.ИздержкиОбращения;
    Счет4402 = ПланыСчетов.Хозрасчетный.КоммерческиеРасходы;
    
    Для каждого Запись из НаборЗаписей Цикл
        Если Запись.Содержание = "Начислен ежегодный отпуск" Тогда
            Если Запись.СчетДт = Счет20 Тогда
                Запись.СубконтоДт.СтатьиЗатрат = Справочники.СтатьиЗатрат.НайтиПоКоду("000000022");
            ИначеЕсли Запись.СчетДт = Счет23 Тогда
                Запись.СубконтоДт.СтатьиЗатрат = Справочники.СтатьиЗатрат.НайтиПоКоду("000001053");
            ИначеЕсли Запись.СчетДт = Счет25 Тогда
                Запись.СубконтоДт.СтатьиЗатрат = Справочники.СтатьиЗатрат.НайтиПоКоду("000001064");
            ИначеЕсли Запись.СчетДт = Счет26 Тогда
                Запись.СубконтоДт.СтатьиЗатрат = Справочники.СтатьиЗатрат.НайтиПоКоду("000001000");
            ИначеЕсли Запись.СчетДт = Счет4401 Тогда
                Запись.СубконтоДт.СтатьиЗатрат = Справочники.СтатьиЗатрат.НайтиПоКоду("000001015");
            ИначеЕсли Запись.СчетДт = Счет4402 Тогда
                Запись.СубконтоДт.СтатьиЗатрат = Справочники.СтатьиЗатрат.НайтиПоКоду("000001015");
            КонецЕсли;
        КонецЕсли;
    КонецЦикла;
    
    НаборЗаписей.ОбменДанными.Загрузка = Истина;
    НаборЗаписей.Записать();

В отладке вижу, что статьи затрат меняются, но после записи всё остаётся по старому. В чём может быть проблема?
1 Ненавижу 1С
 
гуру
12.09.25
08:19
Например движения записываются после обработки проведения платформой
Но ваш код по сути унылое г...
2 Chai Nic
 
12.09.25
08:32
Если Запись.Содержание = "Начислен ежегодный отпуск" Тогда
---
Ой блин...
3 Pahom
 
12.09.25
08:51
(1) (2) Можете предложить лучше? Или так, чсв почесать?
4 Гена
 
гуру
12.09.25
08:53
(0) И 23, и 25... Фирма не относится к малым предприятиям?
5 Pahom
 
12.09.25
09:02
(4) Относится, но и 23 и 25 вполне оправданы, да и вопрос какбэ не в этом.
6 Ненавижу 1С
 
гуру
12.09.25
09:09
(3) Можем, но это не отменяет факт гуанокодинга
7 Pahom
 
12.09.25
09:11
(6) Я так понимаю, спрашивать как написать без гуано бесполезно.
8 Ненавижу 1С
 
гуру
12.09.25
09:13
(7) полезно, спрашивай, если хочешь
9 СвинТуз
 
12.09.25
09:13
(0)
запись реальных движений (Объект.Движения) затирают, то
что вы записали.
10 2S
 
12.09.25
09:14
(7) постройте регистр соответствия. Условие на запись.содержание иначе не определить?
11 СвинТуз
 
12.09.25
09:15
(3)
Тут чесать не об что.
Вам надо репу свою чесать.
12 Fedor-1971
 
12.09.25
09:16
(0) Точно понимаешь что делаешь?
твой НаборЗаписей затирается при стандартной записи, т.к. в Движения.Хозрасчетный нет твоих изменений
Запись.СубконтоДт.СтатьиЗатрат - это работает? По идее, должно быть как-то так: Запись.СубконтоДт[СтатьиЗатрат], т.к. СубконтоДт/Кт - соответствие

После ОбработкаПроведения делаешь процедуру в расширении или подпиской?
По сути: у тебя остался доступ к Движения, вот их и исправляй

(3) могу  Запись.СубконтоДт.СтатьиЗатрат - проверяй статью затрат, а не текст в содержании
13 Pahom
 
12.09.25
09:16
(8) Хорошо, спрашиваю: как написать то, что мне нужно, без гуано?
14 maxar
 
12.09.25
09:17
(13) Для каждого выборка из Движения.Хозрасчетный Цикл
15 Ненавижу 1С
 
гуру
12.09.25
09:17
(13) тут уже расписали по сути все
в этой и соседней ветке
кстати, зачем их две?
16 СвинТуз
 
12.09.25
09:18
(12)
Ну да. Субконто это таблица тут.
он еще поиск по коду в цикле гоняет
17 Fedor-1971
 
12.09.25
09:19
(14) Так неинтересно, сразу решение выдал, а как же ТСу репу почесать?
18 Гена
 
гуру
12.09.25
09:24
(5) Я просто понять хочу, а что ГБ дальше будет делать аж с пятью разными статьями затрат: Отпускные_20, Отпускные_23, Отпускные_25, Отпускные_26 и Отпускные_44?
А зарплаты тоже на разных статьях: Зарплата_20, Зарплата_23, Зарплата_25, Зарплата_26 и Зарплата_44?
19 Pahom
 
12.09.25
09:27
(12) Код взят из примера на helpf.pro. Сделано в расширении, процедура &После("ОбработкаПроведения").
20 Pahom
 
12.09.25
09:28
(18) Мне тоже интересно, но спорить бесполезно. Зарплата да, тоже на разных статьях. Знаю, что дурь несусветная, но эту дурь не пробить.
21 Serg_1960
 
12.09.25
09:31
(17) Нуу.. ТС, например, можно предложить писать не в "после обработки проведения", а в самом регистре после "Если ТипЗнч(Регистратор)...". Пусть репу почешет и скажет что ему это не подходит:))
22 Pahom
 
12.09.25
09:30
(15) Особенности интерфейса. Не сразу понял, что добавил тему.
23 Гена
 
гуру
12.09.25
09:33
(20) Коль пошла такая пьянка... а остальные статьи по каждому чиху тоже упятерены? Ну там Канцелярия, свет, вода...

Хотя, чего я спрашиваю... у МАЛОГО предприятия судя по коду статей затрат уже больше тысячи(!)
Не убегайте, я впервые с таким сталкиваюсь... Будет что рассказать...
24 Fedor-1971
 
12.09.25
09:36
(19) значит не понимаешь.
этот код для изменения движений документа после записи, т.е. у тебя есть документ в закрытом периоде и тебе очень хочется поменять субконто в проводках - тут он оправдан, а в проведении, есть Движения.Хозрасчётный и они будут записаны в любом раскладе
25 Pahom
 
12.09.25
09:39
(14) Господи, неужели тут есть люди, которые просто отвечают на заданный вопрос? Спасибо огромное!
26 Pahom
 
12.09.25
09:40
(24) Спасибо за разъяснение. Кто бы мог подумать.
27 spiller26
 
12.09.25
09:41
(0) "Прибитые гвоздями" ссылки, конечно тебя тапками закидвют за такое.
"Запись.СубконтоДт.СтатьиЗатрат = Справочники.СтатьиЗатрат.НайтиПоКоду("000000022");"
28 Pahom
 
12.09.25
09:52
(23) Я больше скажу - до меня один умник на этих счетах завел ещё субконто "Номенклатура затрат". Просто справочник с названиями. И ГБ орёт, что оно ей нужно.
Предприятие малое потому что в реестре. По факту не такое уж и малое.
29 spiller26
 
12.09.25
09:43
(25) Тебе уже ответили в (24), смотри движение документа и при условиях подменяй.
Твой код (0) не сработает, он затрется.

По коду смотри где что пишеться, а не выдумывай грабли.
30 Fedor-1971
 
12.09.25
09:43
(23) Не факт, могли, в какой-то период, просто поставить большой код, т.е. статей затрат, штук 50, но, например, часть 1-20, а остальные начинаются с кода 1000

Хотя и такое безобразие встречается, возможно, у них план счетов с выделенным счётом под каждую валюту (и такое видел, бабуська ГБ упорно доказывала, что так правильно, бо ордер на каждую валюту)
31 Гена
 
гуру
12.09.25
09:45
(27) Да для малышей можно говнокодить по кодам. Тем более когда элементов в справочнике за 1000. Чего там перебирать, там цепочка давно известна ГБ.
32 spiller26
 
12.09.25
09:46
(28) В СтатьиЗатрат, нужно было добавить реквизит дополнительный с указанием счета, а не такими вот "гвоздями" в коде.

Многие терпеть не могут подобное в коде и сам ни раз на это натыкался, по типу если "Вася пупкин" тогда
33 Fedor-1971
 
12.09.25
09:48
(28) Может "Номенклатурная группа"? Это, действительно, оправдано, тогда распределение затрат будет более красивым
34 Гена
 
гуру
12.09.25
09:49
(30) Не думаю... ТАКИЕ сами код не меняют, он им не нужен, они наименования смотрят.
Интересно, а как она закрывает месяц с такой простынью? Уж наверняка не одной проводкой оборотного субконто. Скорее всего требует постатейного закрытия тех же 23 и 25 на 20.
А там без говнокода не обойтись, если Отпускные_25 идут на Отпускные_20
35 Pahom
 
12.09.25
09:50
(27) Делать предопределенными? Или как?
36 Гена
 
гуру
12.09.25
09:51
(35) Не заморачивайтесь. В данном случае ГБ шейте гвоздями в коде как решили.
37 spiller26
 
12.09.25
09:55
(35) Так себе идея - задолбёшься потом вспоминать про это при обновлении.
Подумай о последствиях.
Вариантов много как реализовать. Первый вы уже использовали.
38 Fedor-1971
 
12.09.25
09:55
(36) а ну как сменится ГБ - будет цугундер, бо новая захочет свои проводки и придётся разбирать код заново
39 Гена
 
гуру
12.09.25
09:58
(38) Такие пятидесятилетние, выросшие на экселе, несменяемы, ещё и после пенсии будут сидеть как влитые, как патроны в рожке. Такие троих-четверых гендиров пересидят )
40 Fedor-1971
 
12.09.25
09:58
(35) как вариант: сделай регистр сведений правил.
Что-то типа: Счет, Статья затрат - заменять на Счёт, статья затрат и признак Действует
Пусть ГБ развлекается, хочет так, хочет этак - код проведения не изменится
41 Гена
 
гуру
12.09.25
10:00
(40) +
Мне нравится.
42 Fedor-1971
 
12.09.25
10:03
(39) Они с виду вечные, но, таки, жизнь конечна и молодые и шустрые будут заново городить учёт, а прибитый гвоздями код придётся переделать заново, тогда уж проще взять чистую БД и перелить остатки
43 Гена
 
гуру
12.09.25
10:05
(42) Они таких шустрых замш на раз-два обыгрывают в подковёрных играх и конкурентки вылетают с фирмы как пробки из бутылки.
44 spiller26
 
12.09.25
10:10
(40) Вот что-то подобное далал, ещё и "период действия с" нужно, чтобы текущую смотреть, они сами потом меняли уже без моего участия.
45 Гена
 
гуру
12.09.25
10:11
Но мы отвлеклись. А по теме - автору надо просто программно сделать то, что руками делает ГБ. Она заходит в док начисления, жмёт D/K, ставит галочку ручной корректировки и перещёлкивает в дебете статью затрат.
46 spiller26
 
12.09.25
10:30
Вот примерно здесь магия сия происходит, дальше сам.

ОбщМодуль.УчетЗарплаты

Процедура СформироватьПроводкиПоОтражениюЗарплатыВУчете(ТаблицаЗаработнойПлаты, Реквизиты, Движения, Отказ)
47 spiller26
 
12.09.25
10:32
А так автор по ходу ждёт готовое решение от нас.
48 2S
 
12.09.25
10:37
(40) см (10) :)
49 Гена
 
гуру
12.09.25
10:56
(46) Глянул. Там уже готовый массив используется.
Лично я бы изменил в общем модуле ОтражениеЗарплатыВБухучетеБазовый в Функция СоответствиеВидОперацииСтатьяРасходов() Экспорт

Там длинный перечень ИначеЕсли на каждый чих, вот там я бы и добавил такую же строчку вроде:
ИначеЕсли ЗначениеПеречисления = ВидыОперацийМенеджер.ЕжегодныйОтпуск Тогда    
            СоответствиеОпераций.Вставить(ЗначениеПеречисления, Справочники.СтатьиРасходовЗарплата. вот тут свой гвоздь по коду);
50 Гена
 
гуру
12.09.25
11:11
Хотя нет - это для кредита )
А за дебет отвечает функция ниже:
Функция НастройкаБухучетаЗарплатыСотрудника(Сотрудник, ДатаАктуальности) Экспорт
Она с РС БухучетЗарплатыСотрудников тащит дебет.
Значит по уму надо добавлять реквизиты вида начисления, счёта и статьи затрат. Затратно по времени и деньгам )

Ну его... хрень, а не задача...
51 spiller26
 
12.09.25
11:35
Автор не отписываться, так что я пас.
Пусть анализирует уже написанное.
52 Pahom
 
12.09.25
12:53
(47) Автор уже реализовал своё, на говнокоде. Главное - работает. Нет, искать по коду в цикле - это я дал маху, конечно. Но в остальном - не понимаю претензий. Впрочем, я ещё только учусь.
53 Pahom
 
12.09.25
12:55
(40) Вот только статья затрат у отпуска та же, что и у начисления. Тут костылить либо  ЗУП, либо Бухню, либо просто добавить процедуру после проведения на быдлокоде.
54 shuhard
 
12.09.25
13:24
(53) изменение аналитик лучше разместить в модуле Рг бухгалтерии перед записью с отбором по типу документа, в остальном код нормальный