Контроль негативних залишків 1С 8.3
Організації, що використовують у своїй діяльності товарно-матеріальні цінності (ТМЦ), інколи стикаються з проблемою «нестачі» товару у програмі 1С. В результаті, користувач не може завершити операцію проведення документа. Причини появи негативних залишків різні, а пошук та усунення можуть зайняти тривалий час. Практика створення документів без проведення не використовується вже давно, її замінив вбудований механізм у 1С Контроль залишків .
- як налаштувати контроль негативних залишків 1С 8.3;
- як відключити контроль залишків 1С 8.3;
- як виправити негативні залишки 1С.
Облік залишків у 1С
Методика обліку кількісних залишків у різних конфігураціях 1С відрізняється. Це з специфікою предметної області, яку орієнтована програма. Серед найбільш використовуваних у господарській діяльності виділяють зміни:
- 1С: Бухгалтерія 3.0;
- 1С: Управління торгівлею 11.4;
- 1С: Комплексна автоматизація 2;
- 1С: ERP Управління підприємством 2.
Бухгалтерія більше орієнтована формування регламентованої звітності, вартісний облік ТМЦ у ній ведеться разом із кількісним. У решті трьох змін складський облік ведеться відокремлено від фінансів. Тому для розгляду обліку залишків обрано дві конфігурації 1С: Бухгалтерія 3.0 та 1С: УТ 11.4.
Контроль залишків у 1С: Бухгалтерія 3.0
У конфігурації Бухгалтерія 3.0 для зберігання даних за залишками та оборотами ТМЦ використовується регістр, що містить дані в кількісному та вартісному вираженні з прив'язкою до рахунків бухгалтерського обліку. Подивитися рух товарів за рахунками можна через кнопку Дт/Кт , розташовану в журналах та у формах документів.
Повний список усіх рухів ТМЦ відображено у Журналі проводок , розташованому в розділі Операції .У цьому переліку присутні й інші господарські дії.
Рахунки обліку ТМЦ є активними, за правилами бухобліку вони не повинні мати негативного кінцевого сальдо. Контроль негативних залишків у 1С 8.3, то при проведенні (перепроводі) документа обчислюється залишок товару після операції списання.
- помилка "Не вдалося провести документ [Документ]";
- інформаційне вікно із вказівками недостатньої кількості та номер рядка.
Подивитися актуальні залишки в 1С:Бухгалтерія можна через звіт Залишки товарів у розділі Склад або, використовуючи стандартні бухгалтерські звіти.
Контроль залишків у 1С: Управління торгівлею 11.4
В УТ кількісні залишки та обороти ТМЦ зберігаються окремо від собівартості у спеціальних регістрах:
- Товари організації - Кількість товарів у розрізі організацій;
- Товари на складах - поточні залишки на складі;
- Вільні залишки — залишки товарів, доступні на продаж, переміщення тощо.
Для перегляду записів по регістрах, які утворилися після проведення документа, перейдіть до Звітів — Рух документа .
Сформується звіт із записами, які програма зробила за цим документом у регістрах.
Щоб отримати в програмі залишки товарів, відкрийте звіт: Склад і доставка — Звіти по складу — Відомість товарів на складах .
Негативні залишки в 1С.
Вимкнена функція контролю негативних залишків може призвести до:
- пересортиці одного товару та нестачі іншого. Наприклад, якщо користувач замість потрібної позиції занесе до документа подібну за назвою. В результаті за реалізованою номенклатурою утворюється мінусовий залишок, а за необхідним товаром у програмі — надлишок;
- зміну податкових сум, коли негативні залишки виявили пізно у вже закритому податковому періоді;
- неправильного розрахунку собівартості товару.
Мінусові кількості у звітах сигналізують про порушення обліку. Увага приділяється закриттю місяця, де не допускається наявність негативних залишків.
Якщо ви виявили негативні залишки в 1С 8.3 Бухгалтерія — як прибрати їх?
- Перевірте журнали прибуткових документів: надходження, переміщення, повернення тощо. Якщо опція контролю вимикалася для можливості списувати неоприбуткований товар, то згодом користувач може забути зареєструвати/провести прихід.
- Причиною негативного залишку може бути неправильно зазначена номенклатура у реалізації. Крім недостачі утворюється надлишок з іншого товару. У таких випадках оформлюють два документи:
- Оприбуткування товарів для прийняття до обліку відсутніх позицій;
- Списання товарів , щоб усунути пересортицю.
Після внесення коригувань скористайтеся функцією групового перепроведення (Операції — Сервіс — Групове перепроведення документів), щоб коректно розподілилися дані по регістрам.
В УТ для виправлення мінусів у номенклатурі є спеціальний помічник Фінансовий результат та контролінг - Сервіс - Помічник виправлення залишків товарів організацій.
Як відключити контроль негативних залишків у 1С
Ситуації з нестачею залишків у 1С можуть виникати з різних причин і потребують часу для усунення.Іноді необхідно виписати, наприклад, витратну накладну на товар, який за фактом вже надійшов на склад, але документи приходу ще не внесені.
Механізм контролю залишків у типових конфігураціях 1С застосовується в документах, що фіксують рух ТМЦ: видаткові накладні, переміщення, списання, повернення тощо — якщо ця опція включена в налаштуваннях.
Як прибрати контроль залишків у 1С 8.3 Бухгалтерія
Щоб вимкнути контроль залишків у 1С 8.3 Бухгалтерія:
- перейдіть до Адміністрація — Налаштування програми — Проведення документів;
- у вікні налаштувань проведення документів позначте пункт Дозволити списання запасів за відсутності залишків за даними обліку .
При включеній опції контроль залишків в 1С 8.3 Бухгалтерія поширюється попри всі організації, облік якими ведеться у цій базі.
Проведені документи з дефіцитом ТМЦ відображаються у госпопераціях частково: вартість відсутніх товарів не враховується.
Розглянемо з прикладу.
У 1С Бухгалтерія 3.0 відключено контроль залишків.
У русі документа не списалася собівартість відсутнього товару немає документа надходження, що логічно у разі, т. до. прихід не заведено/проведено.
У звіті Залишки товарів у цій позиції кінцевий залишок необов'язково буде мінусової.
Крім того, при великому обсязі номенклатури відстежувати негативні залишки зручніше в окремому звіті.Спеціально для цих цілей у 1С розроблено Контроль негативних залишків , розташований у розділі Склад — Звіти.
Якщо контроль вимкнено постійно, частіше моніторуйте залишки за звітами.
У 1С:Бухгалтерія функція контролю залишків не поширюється на документи надходження: під час редагування чи скасування проведення утворення негативних залишків не перевіряється.
Як усунути контроль залишків у 1С Управління торгівлею 11.4
У конфігураціях 1С УТ для відключення контролю залишків:
- Перейдіть до НСІ та адміністрування — Налаштування НСІ та розділів — Фінансовий результат та контролінг.
- Відкрийте розділ Облік товарів і зніміть прапор біля поля Контролювати залишки товарів організацій .
Тут можна вимкнути контроль залишків на час сеансу для поточного користувача однойменною кнопкою.
У попередніх версіях 1С:УТ існувала опція Контролювати товари організацій у разі скасування приходів , яка перевіряла залишки ТМЦ у прибуткових документах при спробах перепровести, скасувати проведення чи видалити. Потім її скасували, а виконувану функцію включили до загального механізму контролю залишків.
Контроль залишків у замовленнях
Механізм контролю залишків у таких конфігураціях, як 1С:Управління торгівлею, 1С:ERP, 1С: Комплексна автоматизація розширено і дозволяє вимкнути перевірку лише у замовленнях. Документи Замовлення клієнтів не відносяться до первинних, тому мають інформаційний характер. В організаціях для замовлень можуть застосовуватись правила:
- лише наявні на складах товари;
- дозволяти включати відсутню номенклатуру з подальшим замовленням її у постачальників.
В УТ 11.4 опція Контролювати забезпечення знаходиться у формі елемента довідника Склади та магазини, доступного в розділах Склад та доставка і НСІ та адміністрування - НСІ .
Якщо необхідно контролювати у замовленнях залишки за окремими товарами, їх вказують у Винятки . У вікні Номенклатура
з контролем забезпечення кнопкою Додати із довідника вибираються ТМЦ. Після Записи та закриття вікна кількість винятків відобразиться у дужках.
Опція працює в обидві сторони: можна навпаки включити контроль забезпечення, але за деякими позиціями не проводити перевірку, додавши їх до Винятки .
Програми 1С для ведення господарського обліку дозволяють своєчасно виявляти та виправляти негативні залишки. Радимо не нехтувати цією можливістю: адже некоректні залишки можуть спричинити невірно розраховані податкові зобов'язання, а також правову відповідальність, якщо йдеться, наприклад, про невідповідність залишків щодо алкогольної продукції.
також:
Якщо Ви ще не підписані:
Активувати демо-доступ безкоштовно →
або
Передплатити Рубрикатор →
Після оформлення підписки вам стануть доступні всі матеріали з 1С:Бухгалтерія, записи підтримуючих ефірів і ви зможете ставити будь-які питання з 1С.
Підписуйтесь на наші YouTube та Telegram щоб не пропустити важливі зміни 1С та законодавства
Чи допомогла стаття?
Отримайте ще секретний бонус та повний доступ до довідкової системи БухЕксперт8 на 8 днів безкоштовно
Подібні публікації
- Резервування товарів в УТ 11.5p align="justify"> Для грамотного планування складських залишків важливо використовувати механізм резервування ТМЦ. Резервування допомагає вести контроль за товарорухом і уникати дефіциту товарів.
- Звіти про рух товарів за складами організації в УТ 11.5Звіти допомагають оперативно отримати зведену інформацію щодо наявності, руху, залишків товарів організації. У статті розглянемо алгоритм налаштування та використання складських...
- Оформлення продажу на декілька замовлень в УТ 11.5При роботі з документом Замовлення клієнта може виникнути потреба об'єднати кілька замовлень в одну реалізацію. У статті розглянемо, як налаштувати...
- Переміщення товарів у 1С 8.3 між складамиПереміщення матеріально-виробничих запасів з одного складу організації в інший є нормальною операцією. Її оформлення у програмі 1С 8.3 Бухгалтерія повністю…
(2 оцінок, середнє: 5,00 з 5)
Публікацію можна обговорити у коментарях нижче.
Зверніть увагу!
У коментарях наші експерти не відповідають на запитання щодо програм 1С та законодавства.
Поставити запитання нашим фахівцям можна в Особистому кабінеті
Семінари
"Нова" та "стара" методики контролю негативних залишків під час проведення документів у системі 1С:Підприємство 8.3
Ця стаття призначена для впроваджених 1С – і особливо для тих, хто готується до Атестації на 1С:Фахівець з платформи.
Сьогодні ми розберемо 2 методики контролю залишків – причому не лише залишків на складі, а й, наприклад, взаєморозрахунків ("яка поточна заборгованість клієнта і чи можна відвантажувати йому товари")
Обидві методики застосовуються і в типових конфігураціях, і Атестаційних завданнях. І оскільки їх дві – потрібно чітко розуміти, коли застосовна "нова" методика, а коли тільки "стара".
Це базові знання для програмістів 1С, рекомендуємо не залишати прогалин у таких областях. На вивчення у Вас має піти 15 хвилин :)
Постановка задачі
Візьмемо просту конфігурацію з документами "Надходження товарів" та "Реалізація товарів":
Для обліку залишків використовується регістр накопичення "Вільні залишки":
Під час проведення документа “Надходження товарів” виконуються рухи-прихід:
Процедура ОбробкаПроведення(Відмова, Режим)
Рухи.ВільніЗалишки.Записувати = Істина;
Для кожного ТекСтрокаТовари З Товари Цикл
Рух = Рухи.ВільніЗалишки.Додати();
Рух.ВиглядРуху = ВидРухуНакопичення.Прихід;
Рух. Період = Дата;
Номенклатура = ТекРядокТовари.Номенклатура;
Рух.Кількість = ТекРядокТовари.Кількість;
КінецьЦикл;
Обробка проведення документа «Надходження товарів» виконана за допомогою конструктора рухів та інтересу не представляє, тому що при надходженні на склад контроль залишків не потрібен.
Іноді контроль залишків реалізують й у документа «Надходження товарів» – щоб у разі скасування проведення чи перепроведення документа не утворився негативний залишок.
Наприклад, на склад надійшли 10 нових телевізорів LG, 6 із них було продано. Якщо у документі надходження 10 шт. виправити 5 шт. - Утворюється негативний залишок «мінус 1 шт.».
У типовий УТ 11 подібний контроль включається за допомогою функціональної опції «Контролювати товари організацій при скасуванні приходів».
Під час проведення документа «Реалізація товарів» необхідно організувати контроль залишків. Якщо товару на залишках недостатньо, документ не проводиться та видається діагностичне повідомлення. У цьому полягає завдання, що розв'язується.
Ми свідомо працюємо над простим завданням, коли собівартість при списанні не розраховується. Це дозволить нам зосередитись саме на нюансах контролю залишків.
Примітка - Наведені нижче алгоритми розроблені для навчання і повинні бути максимально зрозумілими.
Їх можна оптимізувати, але тоді «коефіцієнт розуміння» буде нижчим, тому в цій статті ми на цьому не зупиняємось.
Звичайно, Ви можете оптимізувати їх самостійно, або пройти наш курс з прискорення та оптимізації 1С :)
Як Ви вже зрозуміли, розв'язання задачі може бути виконане двома способами.
Стара методика контролю залишків
Принцип старої методики контролю залишків наступний: перевіряємо, чи є залишок товарів у потрібній кількості..
Алгоритм у старій методиці складається з кількох блоків:
- Запитом виходять залишки товарів та дані документа
- У циклі виконується контроль достатності товарів
- Якщо товарів недостатньо, то документ не проводиться
- Якщо товарів достатньо - виконуються рухи-витрата
Ось так виглядає програмний код:
Процедура ОбробкаПроведення(Відмова, РежимПроведення)
// 1. Очищення старих рухів регістру
Рухи.ВільніЗалишки.Очистити();
Рухи.ВільніЗалишки.Записувати = Істина;
Рухи.Записати();
// 2. Отримання запитом даних документа та залишків регістру
Запит = Новий Запит;
Запит.Текст =
"ВИБРАТИ
Номенклатура ЯК Номенклатура, |
| СУМА (Товари.Кількість) ЯК Кількість |
|ПОМІСТИТИ Товари
|З
|Документ.РеалізаціяТоварівПослуг.Товари ЯК
|ДЕ
|Товари.Посилання = Посилання |
|
|ЗГРУПУВАТИ ПО
|Номенклатура |
|
|ІНДЕКСУВАТИ ПО
| Номенклатура |
|;
|
|////////////////////////////////////////////////////////////////////////////////
| ВИБРАТИ
Номенклатура ЯК Номенклатура, |
ПОДАННЯ ПОСИЛАННЯ(Товари.Номенклатура) ЯК НоменклатураУявлення,
|Кількість ЯК Кількість,
|Є NULL(Залишки.КількістьЗалишок, 0) ЯК Залишок
|З
| Товари ЯК
| ЛІВОЕ З'ЄДНАННЯ РегістрНакопичення.ВільніЗалишки.Залишки(
| &МоментЧасу,
| Номенклатура В
| (ВИБРАТИ
| Номенклатура ЯК Номенклатура
| З
| Товари ЯК Товари)) ЯК Залишки
| ПЗ Товари.Номенклатура = Залишки.Номенклатура";
Запит.ВстановитиПараметр("Посилання", Посилання);
Запит.УстановитиПараметр("МоментЧасу", МоментЧасу());
РезультатЗапиту = Запит.Виконати();
// 3. Обхід результатів запиту
ВибіркаТовари = РезультатЗапроса.Вибрати();
Поки ВибіркаТовари.Наступний() Цикл
// 4. Перевірка на достатність товарів
Дефіцит = ВибіркаТовари.Кількість - ВибіркаТовари.Залишок;
Якщо Дефіцит>0 Тоді
Відмова = Істина;
Повідомлення = Новий ПовідомленняКористувачеві;
Повідомлення.Текст = "Товара "+ВибіркаТовари.НоменклатураУявлення+" недостатньо в кількості "+Дефіцит+" шт.";
Повідомлення.Повідомити();
КінецьЯкщо;
// 5. Перехід початку циклу, якщо були помилки
Якщо Відмова Тоді
Продовжити;
КінецьЯкщо;
// 6. Виконання рухів у регістри
Рух = Рухи.ВільніЗалишки.ДодатиВитрата();
Рух. Період = Дата;
Рух.Номенклатура = ВибіркаТовари.Номенклатура;
Рух.Кількість = ВибіркаТовари.Кількість;
КінецьЦикл;
// 7. Встановлення прапора запису рухів наприкінці транзакції
Рухи.ВільніЗалишки.Записувати = Істина;
Прокоментуємо ключові точки алгоритму.
1. Очищення старих рухів регістру
Нижче в алгоритмі буде запит до залишків регістру.
Якщо поточний документ було раніше проведено, то існує можливість отримати у запиті старі рухи документа - Це серйозна проблема.
Коли можлива така ситуація? Коли дата документа зрушується вперед.
Покажемо на прикладі, до чого це призведе:
- Залишок настільних ламп 10 шт.
- Проводиться документ від 16.02.17, списуємо 6 ламп
- У документі змінюється дата на 17.02.17 (дату можна змістити хоч на 1 секунду вперед), перекладаємо документ.
Якщо очищення рухів не виконувати, система повідомить про брак 2 штук. Чому? Та тому що старі рухи документа списали 6 із 10 наявних ламп. Далі система намагається списати ще 6 штук, а на рештках є лише 4.
Проблема вирішується у 3 рядки коду:
- Виконується очищення набору записів (він міг бути прочитаний на формі або попередніх обробників)
- Набір записів встановлює прапор «Записувати»
- Виконується запис усіх наборів, які мають прапор «Записувати»
Рекомендується використовувати запис через колекцію «Руху», щоб уникнути можливих взаємоблокувань — коли в різних документах одні й ті самі регістри записуються у різній послідовності.
Строго кажучи, ми можемо керувати очищенням рухів під час проведення документів:
Варіант із видаленням рухів при скасуванні проведення є рекомендованим – ми самі керуємо, коли потрібно дійсно видаляти рухи.
2. Отримання запитом даних документа та залишків регістру
Запит складається з двох пакетів:
- У першому виходять згруповані дані табличної частини - створюється тимчасова таблиця
- У другому запиті до даних документа приєднуються залишки з регістру.
На що варто звернути увагу на цей запит:
- При створенні тимчасової таблиці індексується поле, яким далі буде виконуватися з'єднання – це зроблено для оптимальної продуктивності
- Момент отримання залишків – відповідають положенню документа на часовій осі
- Залишків у регістрі може бути – тому виконується ліве з'єднання й у ресурсу «Кількість» застосовується функція «ECТЬNULL» – значення NULL призводить до нулю.
3. Обхід результатів запиту
Розроблений запит містить згруповані дані документа та залишки за номенклатурними позиціями.
У циклі обходимо результат цього запиту.
4. Перевірка на достатність товарів
Якщо дефіцит більший за нуль, значить, товару не вистачає:
- Видаємо діагностичне повідомлення
- Виставляємо параметр «Відмова» обробки проведення значення «Істина»
Якщо «Відмова» дорівнюватиме «Істина», то результат транзакції проведення документа не буде зафіксовано. Говорячи простою мовою – це команда системи не проводити цей документ.
5. Перехід на початок циклу, якщо були помилки
Якщо цьому чи попередніх кроках циклу були помилки (Відмова = Істина), тоді немає сенсу формувати руху. Все одно до бази даних вони не будуть записані.
6. Виконання рухів у регістри
Якщо перевірка залишків пройшла успішно, формуємо рух-витрату.
7. Встановлення прапора запису рухів наприкінці транзакції
Якщо цей прапор не встановити, то рухи НЕ будуть записані.
Наприкінці транзакції проведення документа записуються лише набори записів, які мають прапор «Записувати».
Заради справедливості зазначимо, що встановлення якості "Записувати" набору записів має сенс за однієї умови - у якості документа "Запис рухів при проведенні" має бути вказано значення "Записувати вибрані":
Однак саме значення "Записувати вибрані" є стандартом де-факто:
- Воно використовується у типових рішеннях
- Встановлюється за умовчанням під час створення нових документів.
Інше значення якості - "Записувати модифіковані" є застарілим і в сучасних конфігураціях майже не зустрічається.
Нова методика контролю залишків
У новій методиці використовується принцип: списуємо необхідні товари, далі перевіряємо - чи утворилися негативні залишки по товарах документа. Якщо так, то необхідно відкотити проведення документа.
Як бачите, важлива різниця в моменті контролю залишків:
- Стара методика – спочатку перевіряємо залишок, потім списуємо
- Нова методика – спочатку списуємо, потім перевіряємо решту.
В результаті програмний код буде виглядати так:
Процедура ОбробкаПроведення(Відмова, РежимПроведення)
// 1. Отримання запитом даних документа
Запит = Новий Запит;
Запит.МенеджерТимчасовихТаблиць = Новий МенеджерТимчасовихТаблиць;
Запит.Текст =
"ВИБРАТИ
| Номенклатура ЯК Номенклатура,
| СУМА(Товари.Кількість) ЯК Кількість
|ПОМІСТИТИ Товари
|З
| Документ.РеалізаціяТоварівПослуг.Товари ЯК
|ДЕ
| Товари.Посилання = &Посилання
|
|ЗГРУПУВАТИ ПО
| Товари.Номенклатура
|
|ІНДЕКСУВАТИ ПО
| Номенклатура
|;
|
|////////////////////////////////////////////////////////////////////////////////
| ВИБРАТИ
| Номенклатура ЯК Номенклатура,
| Товари.Кількість ЯК Кількість
|З
| Товари ЯК Товари";
Запит.ВстановитиПараметр("Посилання", Посилання);
РезультатЗапиту = Запит.Виконати();
// 2. Формування рухів-витрата регістру
Рухи.ВільніЗалишки.Очистити();
ВибіркаТовари = РезультатЗапроса.Вибрати();
Поки ВибіркаТовари.Наступний() Цикл
Рух = Рухи.ВільніЗалишки.ДодатиВитрата();
Рух. Період = Дата;
Рух.Номенклатура = ВибіркаТовари.Номенклатура;
Рух.Кількість = ВибіркаТовари.Кількість;
КінецьЦикл;
// 3. Запис рухів у БД
Рухи.ВільніЗалишки.Записувати = Істина;
Рухи.Записати();
// 4. Запит, який отримує негативні залишки з регістру
Запит.Текст =
"ВИБРАТИ
| Номенклатура ЯК Номенклатура,
| ПОДАННЯ ПОСИЛАННЯ(Залишки.Номенклатура) ЯК НоменклатураУявлення,
| -Залишки.КількістьЗалишок ЯК Дефіцит
|З
| РегістрНакопичення. Вільні Залишки.
| &МоментЧасу,
| Номенклатура В
| (ВИБРАТИ
| Номенклатура ЯК Номенклатура
| З
| Товари ЯК Товари)) ЯК Залишки
|ДЕ
| Залишки.КількістьЗалишок < 0";
КордонКонтролю = Новий Кордон(Момент Часу(), ВидКороди.Включаючи);
Запит.ВстановитиПараметр("Момент Часу", КордонКонтролю);
РезультатЗапиту = Запит.Виконати();
// 5. Виведення повідомлень про нестачу товарів
Якщо не результат Запиту.Порожній() Тоді
Відмова = Істина;
ВибіркаПомилки = РезультатЗапроса.Вибрати();
Поки ВибіркаПомилки.Наступний() Цикл
Повідомлення = Новий ПовідомленняКористувачеві;
Повідомлення.Текст = "Товара "+ВибіркаПомилки.НоменклатураПредставлення+" недостатньо в кількості "+ВибіркаПомилки.Дефіцит+" шт.";
Повідомлення.Повідомити();
КінецьЦикл;
КінецьЯкщо;
Розберемо ключові точки алгоритму.
1. Отримання запитом даних документа
Далі ці дані будуть використані для створення рухів.
Зверніть увагу, що в першому запиті пакета створюється тимчасова таблиця – вона буде використовуватись і в наступному запиті. Це можливо завдяки менеджеру тимчасових таблиць, створеного для цього запиту.
2. Формування рухів-витрата регістру
У циклі записуються дані з документа до регістру – тобто виконується безумовне (без перевірки) списання товарів.
3. Запис рухів у БД
4. Запит, який отримує негативні залишки з регістру
А тепер простим запитом обираємо негативні залишки по товарах документа.
Саме тут використовується створена першому кроці тимчасова таблиця – накладається умова на номенклатуру (для цього ми не створюємо новий об'єкт типу «Запит», а використовуємо створений раніше).
Зверніть увагу, як передається момент часу – використовується тип даних «Кордон».
Чи можна було отримати залишки без кордону, наприклад, додавши до дати документа 1 секунду?
Адже в одній секунді може бути велика кількість документів.
5. Виведення повідомлень про нестачу товарів
Якщо результат запиту не порожній, то є негативні залишки – у цьому випадку документ не проводиться і видаються повідомлення про всі помилки.
Переваги контролю залишків за новою методикою
Отже, обидва алгоритми вирішують одну й ту саму задачу.
Різниця між алгоритмами помітна, але переваги не очевидні.
Тому давайте підкреслимо їх:
- Немає необхідності очищати старі рухи документа. По суті це операція запису в БД порожнього набору рухів та видалення існуючих рухів - це досить ресурсомісткі операції
- Запит, який отримує дані щодо негативних залишків, звертається лише до однієї таблиці – немає необхідності робити ліве з'єднання з даними документа та застосовувати функцію «ЄСТЬNULL()»
Крім цього, при нормальному перебігу бізнес-процесів користувач вказує кількість, що не перевищує залишок на складі.
У цьому випадку другий запит не поверне жодних даних та проведення документа буде максимально швидким.
А чи важливі ці мілісекунди?
На базах з невеликою кількістю даних та користувачів різниця буде непомітною. Але в навантажених системах із десятками користувачів ціна кожної мілісекунди висока.
Крім того, на іспиті 1С:Фахівець з платформи потрібно обов'язково використовувати новий спосіб контролю залишків, якщо це допускає конкретне завдання.
Ok, значить, потрібно завжди використовувати нову методику, правда?
Нова методика може використовуватися тільки в тому випадку, якщо для проведення документа є всі необхідні дані у самому документі.
Тобто для отримання даних не потрібно звертатися до регістрів, якими здійснюється контроль залишків.
Так, наприклад, якби в регістрі «Вільні залишки» враховувалася б і сума, то довелося б використати стару методику контролю.
Чому?
Та просто, щоб розрахувати суму списання собівартості, доведеться звернутися до регістру. І якщо ми робимо цей запит ДО формування рухів, то буде сенс відразу отримати доступний залишок.
До речі, у типовій «1С:Управління торгівлею 11» реалізовано контроль залишків за новою методикою, а в «1С:Бухгалтерії 8» – за старою методикою.
Але це ще не все!
Представлені вище алгоритми можна використовувати лише у навчальних цілях. Справа в тому, що в них не враховуються керовані блокування, які необхідно застосовувати, якщо в системі працює більше одного користувача.
Блокуванням для обох методик контролю залишків присвячено окрему статтю. Також у цій статті ми вирішуємо більш складне завдання - крім контролю залишків виконуємо розрахунок собівартості номенклатури, що списується. Рекомендуємо її вдумливо вивчити.
А для «затравки» лише скажемо, що встановлення блокування в новій методиці робиться дуже просто - І це ще одна перевага нового способу контролю залишків.
Підсумки
Підіб'ємо короткі підсумки.
Ми розглянули дві методики контролю залишків, кожна з яких застосовується у сучасних типових конфігураціях.
Ключова відмінність між методиками у моменті контролю залишків:
- Стара методика – контроль до запису рухів у регістри
- Нова методика – контроль після запису рухів у регістри
У загальному випадку нова методика є більш ефективною, але застосовна вона не завжди.
Критерій застосування – якщо формування рухів немає необхідності звертатися до даних контрольованого регістру, можна використовувати нову методику.
Якщо говорити про контроль залишків за номенклатурою, то застосування нової методики можливе, коли дані про собівартість та складські залишки зберігаються в різних регістрах.
І на завершення приклади з типових конфігурацій:
- У УТ 11 є 2 основних регістри для обліку номенклатури: Вільні залишки (кількість) та Собівартість товарів (дані про собівартість) – використовується нова методика
- У БП 3.0 дані про собівартість та залишки зберігаються в одному регістрі бухгалтерії – використовується стара методика контролю залишків.
Вивантаження ІБ та PDF-версія статті для учасників групи ВКонтакте
Якщо Ви ще не вступили до неї – зробіть це зараз, та у блоці нижче (на цій сторінці) з'являться посилання на завантаження матеріалів.
Стаття у PDF-форматі
Ви можете завантажити цю статтю у форматі PDF за наступним посиланням: Посилання доступне для зареєстрованих користувачів)
ІБ розроблялися на платформі 1С:Підприємство 8.3.9.1850.
Коментарі / обговорення (139):
Доброго дня! Скажіть, будь ласка, під час проведення документа (Реалізація товарів) по кількох регістрах, чи достатньо перевірити залишки при проведенні для першого регістру (якщо не вистачає)? Документ тоді не проведеться по всіх регістрах, а якщо вистачає, то чи може виникнути ситуація, коли по одному проведеться, а по решті регістрів може сформуватися негативний залишок?
Доброго дня!
Рекомендую у такому разі контролювати залишки по всіх регістрах. У конфігурації може існувати документ "Операція" (ручна проводка) або "Коректування записів регістрів", за допомогою якої можуть бути виправлені записи тільки в одному регістрі, такі ситуації краще враховувати.
При атестації на 1С:Фахівець з платформи перевірка залишків тільки по одному регістру вважатиметься помилкою?
Очевидно, у списку помилок такого пункту немає. За відгуками тих, хто складав іспит, потрібно робити контроль по двох регістрах.
У процедурі нового способу проведення не вистачає установки менеджера тимчасових таблиць для другого запиту.
Доброго дня!
Ні, у п. 4 програмного коду використовується той самий об'єкт Запит, що у п. 1, де призначається менеджер тимчасових таблиць.
Значить, не потрібно створювати новий менеджер тимчасових таблиць та надавати його запиту, адже в п. 4 у тексті запиту використовується звернення до тимчасової таблиці Товари, яка була сформована у п. 1.
Доброго дня, бачив таку фразу в умовах виставлення оцінки з іспиту (ATT) "Не реалізована можливість коректного перепроведення документів заднім числом"
Що це означає?
Доброго дня!
Це означає, що якщо існуючий проведений документ переводиться заднім числом (і при цьому дані документа не змінюються), то нові рухи документа повинні бути такими ж, як і до перепроведення. приклад. За умови завдання зазначено, що облікова політика може змінюватися з часом. Отже, слід зберігати історію змін облікової політики. При проведенні документа заднім числом потрібно отримувати саме ті налаштування облікової політики, які діяли на момент часу документа, а не ті, що діють зараз. Тому для зберігання налаштувань облікової політики логічно використовувати періодичний регістр відомостей, тоді в коді достатньо отримувати дані з віртуальної таблиці Зріз Останніх. Якщо ж реалізувати збереження значення облікової політики, наприклад, у довіднику, то, з одного боку, якщо не врахувати можливість її зміни і не реалізувати способу отримання її значення на певний час, це може призвести до зниження оцінки. З іншого боку, якщо навіть додати до довідника реквізити для зберігання періоду дії облікової політики, то такий варіант рішення буде нераціональним – його реалізація (заповнення та отримання необхідних значень) буде більш громіздкою та трудомісткою, ніж при використанні регістру відомостей. Та й у екзаменатора можуть виникнути цілком закономірні сумніви, що іспит, що складає, знайомий з цим механізмом і вміє ним користуватися.
Добрий день. Таке запитання. Я правильно розумію, що при списанні за партіями ЗАВЖДИ використовуватиметься стара методика проведення? Тому що нам треба знати, скільки товару знаходиться в кожній партії, щоб списувати потрібну кількість товару
Доброго дня!
Нова методика може використовуватися лише у тому випадку, якщо для проведення документа є всі необхідні дані у самому документі.
Наприклад, облік собівартості ведеться з точністю до партії, у документі реалізації користувач вручну вказує партії, у тому числі потрібно зробити списання. У такому разі можна використати нову методику.
А так Ви правильно помітили, що при списанні ФІФО частіше буде використовуватися стара методика, т.к. відомості про партії, що списуються, відсутні в самому документі.
Взагалі не зрозуміло як за “новою” методикою спишуться потрібні партії… Щоб списати партії з будь-якого треба прочитати залишок партій і списати по ФІФО….
Доброго дня!
У статті зазначено, що нова методика може використовуватися лише у тому випадку, якщо для проведення документа є всі необхідні дані у самому документі.
У Вашому прикладі відомості про партії, що списуються, відсутні в самому документі, тому потрібно скористатися старою методикою.
“Запит, який отримує дані щодо негативних залишків, звертається лише до однієї таблиці – немає необхідності робити ліве з'єднання з даними документа та застосовувати функцію «Є NULL()»” Здрастуйте. А якщо все-таки зробити ліве з'єднання з табличною частиною в цій методиці це вважатиметься помилкою?
Здрастуйте. Якщо можна вирішити більш простим способом (в даному випадку якраз можна обійтися без з'єднання), то штучне ускладнення, понад необхідне, вважатиметься помилкою (тип помилки: "Неоптимальне, неефективне рішення").
А якщо я захочу з документа Реалізація Товарів Послуг зробити повернення певної кількості, як це робити
Здрастуйте. І тут створюється інший документ, зазвичай називається “Повернення від покупця”.Суть його рухів – скасування вихідної реалізації, тобто. виконується витрата з мінусом – за тією номенклатурою, що була у вихідному документі реалізації та з кількістю, що не перевищує кількість реалізації. Тільки яке відношення цей документ має до теми цієї статті? За формою це прибутковий документ, власне – сторнирующий, ніякого контролю залишків не буде, т.к. залишків проданих товарів просто немає (залишки були списані під час продажу).
[Рухи.ВільніЗалишки.Очистити();] – Не потрібен цей операнд (у новій методиці). Колекція рухів ще пуста.
[Рухи.ВільніЗалишки.Очистити()] – операнд в обробці проведення, що відноситься до нової методики, на мій погляд – зайвий.
Здрастуйте. Властивість документа Рухи містить список наборів записів регістрів, якими документ може виконувати руху (є реєстратором).
Рухи – це об'єкт у пам'яті. При відкритті документа на редагування об'єкт Рухи може заповнюватися: з бази даних до нього можуть бути зчитані всі наявні рухи цього документа (інакше кажучи, всі записи регістрів, котрим цей документ є реєстратором). Працюючи зі звичайними формами заповнення об'єкта Рухи проводиться щоразу під час відкриття форми документа. Під час роботи з керованими формами заповнення об'єкта Рухи системою проводиться не завжди, а лише якщо виконані деякі специфічні налаштування на формі (наприклад, якщо для властивості Рухи у формі встановлено ознаку “Використовувати завжди“ або якщо рухи документа поміщені на форму). За замовчуванням (якщо на створеній формі спеціально не змінити налаштування) заповнення об'єкта Рухи не проводиться, тому на початку проведення документа об'єкта Рухи буде порожнім, і необхідність його явного очищення відсутня. Таким чином, якщо використовуються керовані форми та спеціально не виконані налаштування на формі, що примушують систему зчитувати рухи документа, то об'єкт Рухи на початку обробки проведення буде порожній, і очищати його не потрібно. В іншому випадку, а також для звичайних форм, об'єкт Рухи на початку обробки проведення буде заповнено існуючими рухами документа, і їх потрібно буде попередньо видалити. Тому з міркувань універсальності метод Рухи.ВільніЗалишки.Очистити() тут не є зайвим.
Щось не вдалося відтворити у звичайних формах - авто зчитування після відкриття форми.
Доброго дня!
Прикріпив приклад на звичайних формах - Рухи Звичайні Форми.zip.
Відкриваємо в режимі користувача форму вже проведеного документа, проводимо його. У відладчику видно, що рухи вже заповнені на початку обробки проведення:
Дякую. Подивився базу.
Відкриваю форму та проводжу – в обробці проведення руху не прочитані.
[url=https://imageup.ru/img72/4401700/bezymiannyi-risunok.png.html][img]https://imageup.ru/img72/thumb/bezymiannyi-risunok4401700.jpg[/img][/url ]
При повторному проведенні, якщо не закривати форму, рухи прочитані (як на вашому скріншоті).
Воно й зрозуміло, ми формували рухи для проведення – вони лишилися в об'єкті.
Пробував також створювати кастомну основну форму: без проведення ПріВідкриття не вдалося отримати "автопрочитані" рухи у формі як у відповіді Павла.
Чи я щось упускаю?
Давайте розбиратися докладно. Спочатку питання було в тому, чи потрібно використовувати очищення рухів в обробці проведення.
Це потрібно робити, якщо використовується звичайна програма.
Тому для універсальності такі конструкції залишалися у коді. >>При повторному проведенні, якщо не закривати форму – рухи прочитані (як на вашому скріншоті).
Воно й зрозуміло, ми формували рухи для проведення – вони лишилися в об'єкті.
Так, правильно, саме так у звичайному додатку працює.
Змініть основний режим запуску на керовану програму для конфігурації. І така поведінка не відтворюватиметься. Також можна звернути увагу, що конструктор рухів формуватиме різний програмний код залежно від основного режиму запуску. І при використанні звичайної програми додаватиме рядок коду з очищенням рухів по регістру.
Це дуже давно. У файлі з описом змін у платформі V8Update.htm можна знайти ось таку цитату:
Версія 8.2.11
Зміни, які потребують змін у конфігураціях:
У конструкторі рухів документів реалізовано увімкнення виклику видалення існуючих рухів у наборах записів, за якими формуються рухи, якщо основний режим конфігурації «Звичайний додаток» та документ має режим «Видаляти автоматично при скасуванні проведення» або «Не видаляти автоматично». Рекомендується виконати відповідні зміни у конфігураціях. Потенційна проблема може виникнути при повторному проведенні зі звичайної форми. При проведенні зі списку або керованої форми такої ситуації не виникає. Відмінності у поведінці пояснюються таким:
– Проведення зі списку щоразу створює новий об'єкт.
– Проведення зі звичайної форми використовує той самий об'єкт.
- Проведення з керованої форми щоразу створює новий об'єкт.
Тому очищення рухів у модулі необхідне для того, щоб очистити рухи в пам'яті, коли один і той самий екземпляр об'єкта в пам'яті проводиться кілька разів. Ось так цей механізм працює.
Доброго дня!
Питання щодо нової методики.
2. Формування рухів-витрата регістру
У циклі записуються дані з документа до регістру – тобто виконується безумовне (без перевірки) списання товарів. 3. Запис рухів у БД
Щоб залишки у регістрі змінилися, рухи потрібно записати. Поясніть, будь ласка, механізм скасування запису рухів у регістр при Відмова=Істина…
Здрастуйте. Проведення документа (точніше – запис документа у режимі проведення) проводиться у транзакції. Для того щоб зроблені зміни перенеслися на базу, транзакція повинна бути зафіксована.
Якщо після закінчення обробки проведення змінна Відмова має значення Брехня, то транзакція буде зафіксована, і сформовані рухи регістру потраплять до бази.
Якщо ж змінна Відмова має значення Істина, то транзакція буде скасована, і сформовані рухи регістру будуть втрачені.
Доброго дня! А чому у старій методиці проведення немає "установки" блокувань перед читанням залишків?
Здрастуйте. У цій статті стара та нова методики проведення розглянуті дещо спрощено, щоб наочніше продемонструвати різницю між ними. Зокрема, для спрощення тут не порушено питання встановлення блокувань. Про це згадано у цій статті у пункті "Але це ще не все!".
У реальних модулях встановлення блокувань, звичайно ж, буде потрібно. Для старої методики код установки міститься до виконання запиту на читання залишків регістру і виглядає приблизно так:
// 7. Кероване блокування даних регістру
Блокування = Новий БлокуванняДаних;
ЕлементБлокування = Блокування.Додати("РегістрНакопичення.СобівартістьТоварів");
ЕлементБлокування.Режим = РежимБлокуванняДаних.Винятковий;
ЕлементБлокування.ДжерелівДаних = РезультатНоменклатура;
ЕлементБлокування.ВикористовуватиДжерелаДаних("Номенклатура", "Номенклатура");
Блокування. Заблокувати ();
Рекомендую ознайомитися з іншою, більш повною статтею на цю тематику: “Методика оперативного проведення та керовані блокування в 1С:Підприємство 8.3 (оновлення 2017 року)” Крім того, нижче наведено ще кілька посилань на статті на цю тематику:
“[ Питання дня ] Які блокування використовуються у «старій» та «новій» методиках проведення документів?” – Тут наведено порівняння підходів до блокування даних для старої та нової методик.
"[Нюанси платформи 1С:Підприємство 8] - Як працює властивість БлокуватиДля Зміни" - Тут вже копнули глибше і розглянули технічні нюанси роботи властивості "БлокуватиДля Зміни".
Здрастуйте.
У перевагах нової методики зазначено перевагу “Нема потреби очищати старі рухи документа”. Але ця операція виконується як у старій методиці, так і в новій.
Чи я щось не так зрозумів?
Доброго дня!
У новій методиці попереднє очищення старих рухів регістру та запис порожнього набору рухів не відбувається.
Для старої методики в даному прикладі це ось цей шматок коду:
// 1. Очищення старих рухів регістру
Рухи.ВільніЗалишки.Очистити();
Рухи.ВільніЗалишки.Записувати = Істина;
Рухи.Записати();
У тексті нової методики у вас чомусь застосовується очищення записів:
// 2. Формування рухів-витрата регістру
Рухи.ВільніЗалишки.Очистити();
ВибіркаТовари = РезультатЗапроса.Вибрати();
Поки ВибіркаТовари.Наступний() Цикл
Рух = Рухи.ВільніЗалишки.ДодатиВитрата();
Рух. Період = Дата;
Рух.Номенклатура = ВибіркаТовари.Номенклатура;
Рух.Кількість = ВибіркаТовари.Кількість;
КінецьЦикл;
// 3. Запис рухів у БД
Рухи.ВільніЗалишки.Записувати = Істина;
Рухи.Записати(); Я так розумію це помилка?
Очищення перед додаванням нових рухів, запис “очищення” та доданих рухів відбувається один раз.
У “старій” відбувається очищення із записом, перед запитом залишків. І плюс запис сформованих рухів наприкінці обробки.
Доброго дня. Навіщо у першому запиті спочатку відбувається очищення рухів? Як розумію щоб рухи не заважали в запиті, але в запиті можна вказати Кордон.
Доброго дня!
Підкажіть у чому справа, зіткнувся з такою ситуацією, я не додаю умову на Залишок < 0, при запиті за новою методикою і все чудово працює (тобто в Результат Запиту потрапляють лише негативні залишки по ТЧ Документу), у чому може бути справа?
Не вмикаю таку умову:
|ДЕ
| Залишки.КількістьЗалишок < 0
Платформа 8.3.15.1565
Добрий день! Відповідь тут може бути тільки одна - у Вас в регістрі, в момент виконання запиту, тільки негативні залишки, позитивних немає.
Добрий день
Підкажіть, будь ласка, щодо моменту, що нова методика використовується тільки якщо всі дані можна отримати відразу з документа.
Якщо, наприклад, йде також розрахунок собівартості за середньою з регістру ЗалишкиТоварів Так, я звертаюся до цього регістру за СуммаОстаток.І ви пропонуєте використовувати стару методику - йти за результатом запиту і дивитися, де КількістьВитрат буде більше КількістьЗалишок, і, якщо все ОК, то записувати рухи (собівартість розраховується в запиті, припустимо) Але я можу в цьому випадку не використовувати цикл, а записати дані із запиту (з розрахованою в ньому собівартістю) в регістр, а потім зробити запит на негативні залишки. запит (за старою методикою) я зроблю вдруге запит до регістру залишків, щоб знайти негативні. Хіба це помилка? Цикл за старою методикою буде швидше за другий запит?
Доброго дня!
Тут ключовим моментом є те, що, за новою методикою, вам доведеться двічі звернутися до одного регістру. Для високо навантажених інформаційних баз це може бути критично, та й на іспиті це вважатиметься помилкою. На базі з невеликою кількістю даних різницю у продуктивності між циклом за старою методикою та другим запитом за новою ви швидше за все не помітите.
Дякую за статтю. Хочу звернути увагу на роз'яснення викладача УЦ-1 та екзаменатора (і укладача завдань для іспиту) Павла Білоусова про те, коли застосовувати дві методики, що обговорюються: на ютубі ролик “Методика проведення документів у завданнях оперативного та бухгалтерського обліку – онлайн від УЦ 1”
youtu.be/1SIQBNrSIOY
За посиланням ні слова про те коли застосовувати дві методики, що обговорюються. Сказано лише, що про це йдеться в їхньому онлайн курсі.
Доброго дня!
Навіщо в старому методі контролю залишків (п.3 алгоритму) в обході вибірки робляться і рухи. Адже може вийти так, що у 100 перших товарів у вибірці дефіциту немає, а у 101 товару дефіцит є. Тоді ми виконуємо зайві рядки коду.
Чи не краще винести рухи з цього циклу в окремий цикл, який виконуватиметься, якщо дефіциту немає, і Відмова залишилася = Брехня?
Добрий день! Рухи у цьому пункті лише формуються, але з записуються до бази даних. Винесення формування рухів в окремий цикл нічого не змінить.
Доброго дня!
Навіщо у запиті у старому методі у п.2. у тексті запиту вибирається 2 поля Товари.Номенклатура та ПоданняПосилання(Товари.Номенклатура).
Хіба недостатньо Подання Посилання?
Добрий день! Подання використовується для формування текстового повідомлення у разі нестачі товару в кількості, а саме посилання використовується у формуванні рухів на шостому кроці. Одного уявлення недостатньо.
Наскільки правильно робити в старій методиці проведення ось так: / / Знімаємо галку поділ підсумків, щоб заблокувати записи за "даним" даними. Щоб при відмові транзакції інший користувач між контролем залишків і відмовою транзакції не списав звільнену номенклатуру
Рухи.ЗалишкиНоменклатури.БлокуватиДля Зміни = Істина;
//Якщо працюємо зі звичайними формами
Рухи. Залишки Номенклатури. Очистити ();
//Якщо режим запису не оперативний, то ми будемо використовувати надалі вибору залишки з моменту() який не включає руху документа
//Якщо режим запису оперативний, то ми очищаємо рухи, тому що при читанні залишків використання Момент Часу() все одно буде брати залишки включаючи рухи даного документа.
Якщо Режим = РежимПроведенняДокумента.
//Пишемо порожній набір записів, прапор ЗалишкиНоменклатури.Записувати = Істина не знімається
Рухи.ЗалишкиНоменклатури.Записати();
КінецьЯкщо; Цікавить чи потрібно знімати поділ підсумків. І чи реально при оперативному проведенні перепроведення призведе до того, що будуть взяті залишки, які включають рухи цього документа?