Как изменить дату начала проведения по партиям в 1С:Управление торговлей 10.3?

Программист 1С v8.3 (Обычные формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

Уважаемые коллеги, нередко мы сталкиваемся с ситуациями, когда старые базы данных 1С:Управление торговлей 10.3 после длительной эксплуатации или процедуры свертки начинают давать сбои в учете. Одной из таких распространенных проблем является нарушение последовательности проведения документов по партиям, что приводит к некорректному расчету себестоимости и искажению управленческой отчетности. Ручное перепроведение огромного массива документов может занять неоправданно много времени и ресурсов. В таких случаях перед нами встает задача — изменить дату начала проведения по партиям, установив новую границу последовательности, с которой система будет считать учет корректным.

Давайте вместе разберемся, как мы можем решить эту проблему, используя функционал 1С и важные предварительные шаги.

Понимание МоментаВремени и Границы последовательности

Прежде чем приступить к техническим действиям, нам необходимо четко понять ключевые понятия в 1С: МоментВремени и Граница последовательности.

  1. МоментВремени: Это не просто дата и время, а уникальная точка на оси событий в базе данных 1С. Он включает в себя дату, время и ссылку на конкретный объект базы данных (чаще всего, документ). МоментВремени позволяет однозначно упорядочить документы, даже если они были проведены в одну и ту же секунду. При получении остатков на определенный МоментВремени система гарантирует учет всех движений, которые были сделаны в ту же секунду, но расположены перед интересующим нас документом.
  2. Граница последовательности: Это специальный объект, который отмечает актуальный МоментВремени, до которого система гарантирует правильность и хронологическую последовательность проведения документов определенного типа. В нашем случае это Последовательность.ПартионныйУчет. Установка границы последовательности означает, что все документы до этой точки считаются проведенными верно и в нужной хронологии, а проверять и восстанавливать последовательность необходимо только с этой точки и далее.

Шаг 1: КРИТИЧЕСКИ ВАЖНО – Очистка ошибок перед сдвигом границы

Мы не можем просто сдвинуть границу последовательности, не подготовив базу. Как справедливо замечают наши коллеги, "прежде чем сдвигать границу, надо ошибки зачистить, иначе как снежный ком, только расти все это будет". Это утверждение является краеугольным камнем успешного решения нашей задачи. Партионный учет основан на строгой хронологии поступления и выбытия товаров для корректного расчета себестоимости. Если мы установим границу на некорректные данные, все последующие расчеты будут также неверными, лишь усугубляя проблему.

Давайте рассмотрим наиболее распространенные ошибки в партионном учете, которые мы обязаны выявить и исправить до установки новой границы:

  1. Списание товаров "в минус": Это происходит, когда программа позволяет продать или списать товар, которого по данным учета нет на складе. Часто такая ситуация возникает, если документ поступления введен более поздним временем, чем документ расхода.
  2. Нарушение хронологии проведения документов: Документы поступления и реализации могли быть проведены не в строгой хронологической последовательности. Это приводит к некорректному определению партий и, как следствие, к неверному расчету себестоимости.
  3. Расхождения между отчетами: Например, количественные остатки в отчете "Ведомость по товарам на складах" могут не совпадать с данными отчета "Ведомость по партиям товаров на складах". Это явный сигнал о проблемах в партионном учете.
  4. Некорректные остатки после свертки базы: Если свертка базы была проведена некорректно, начальные остатки на дату свертки могут быть неверными или не согласованными между собой, что нарушает весь последующий учет.

Для выявления этих ошибок мы можем использовать:

Мы должны гарантировать, что на дату, которую мы выберем в качестве новой границы, учет по партиям будет абсолютно корректен.

Шаг 2: Формирование МоментаВремени для установки границы

После того как мы убедились в чистоте данных до желаемой даты, мы можем перейти к установке границы. Для этого нам понадобится МоментВремени, который будет служить нашей новой точкой отсчета.

В качестве МоментаВремени мы можем использовать любой существующий в базе документ, который является логической точкой отсчета для начала корректного учета. Это может быть:

Главное условие: этот документ должен существовать в базе и иметь нужную нам дату и время, а также быть проведенным. Мы будем искать его по номеру и дате.

Давайте посмотрим на пример кода, который мы можем использовать:


Момент = Документы.ЗакрытиеМесяца.НайтиПоНомеру("0017", Дата(2021,04,30)).МоментВремени;

В этом примере мы ищем документ "ЗакрытиеМесяца" с номером "0017" и датой "30.04.2021". Однако, как было справедливо отмечено в обсуждении, Документы.ЗакрытиеМесяца может отсутствовать или не подходить в вашей базе. В таком случае мы должны заменить его на тот тип документа и его параметры, которые актуальны для нас. Например:


// Пример 1: Использование Реализации товаров и услуг
ТекДокумент = Документы.РеализацияТоваровУслуг.НайтиПоНомеру("Р12345", Дата(2023,01,15));
Если ТекДокумент <> Неопределено Тогда
    Момент = ТекДокумент.МоментВремени;
Иначе
    Сообщить("Документ Реализация товаров и услуг с номером Р12345 от 15.01.2023 не найден!");
    Возврат;
КонецЕсли;

// Пример 2: Формирование МоментаВремени напрямую, если знаем дату и хотим привязаться к началу дня
// или к любому документу, но не знаем его номер, а только ссылку
// Предположим, у нас есть ссылка на документ: СсылкаНаНужныйДокумент
// Момент = Новый МоментВремени(СсылкаНаНужныйДокумент.Дата, СсылкаНаНужныйДокумент);

// Пример 3: Если хотим установить границу на конкретную дату (например, начало дня)
// без привязки к конкретному документу, то можно использовать следующий подход,
// хотя он менее точен, чем привязка к существующему документу.
// Внимание: Этот метод может быть менее надежным для точной установки границы
// по сравнению с привязкой к конкретному документу.
// Момент = Новый МоментВремени(Дата(2023,01,01), Неопределено); // Привязка к началу дня 01.01.2023
// Или можно найти самый первый документ в этот день и взять его МоментВремени.

Мы рекомендуем использовать привязку к существующему документу, так как это дает более точный МоментВремени, учитывающий все проведенные операции до этого документа.

Шаг 3: Установка новой границы последовательности партионного учета

Как только мы получили необходимый МоментВремени, мы можем установить границу последовательности. Для этого используется метод УстановитьГраницу() объекта Последовательности.ПартионныйУчет:

Последовательности.ПартионныйУчет.УстановитьГраницу(Момент);

После выполнения этой строки кода граница последовательности партионного учета будет установлена на выбранный вами МоментВремени. Это означает, что система будет считать все движения до этого момента корректными и при восстановлении последовательности начнет проверку с этой новой точки.

Для проверки установленной границы мы можем использовать:


Граница = Последовательности.ПартионныйУчет.ПолучитьГраницу;
Сообщить("Новая граница последовательности: " + Граница);

Шаг 4: Куда вставить и как выполнить код?

Этот код нам необходимо выполнить в контексте 1С:Предприятия. Есть несколько способов:

  1. Через внешнюю обработку: Это наиболее рекомендуемый способ.
    • Запустите 1С в режиме "Конфигуратор".
    • Выберите меню "Файл" -> "Новый" -> "Внешняя обработка".
    • В открывшемся окне создайте форму обработки и на ней кнопку.
    • В модуле формы этой кнопки создайте процедуру, например, "ПриНажатииНаКнопкуВыполнить()".
    • Вставьте ваш адаптированный код в эту процедуру.
    • Сохраните внешнюю обработку (например, "УстановкаГраницыПартий.epf").
    • Запустите 1С в режиме "Предприятие".
    • Откройте сохраненную внешнюю обработку через "Файл" -> "Открыть".
    • Нажмите на созданную вами кнопку "Выполнить".
  2. Через консоль кода (для опытных пользователей): Многие разработчики используют специальные "Консоли кода", которые позволяют выполнять произвольный код 1С без создания полноценных обработок. Если у вас есть такая консоль, вы можете просто вставить адаптированный код туда и выполнить.

Важно: Перед выполнением любых изменений в рабочей базе обязательно создайте резервную копию!

Особенности работы с последовательностями и дополнительные рекомендации

Мы рассмотрели основной механизм, но есть несколько важных нюансов и дополнительных рекомендаций, которые мы должны учитывать при работе с последовательностями в 1С:УТ 10.3:

  1. Измерения последовательности: Если у последовательности "Партионный учет" (или у других последовательностей, которые вы будете корректировать) есть измерения (например, "Организация"), то при установке границы необходимо указывать отбор по этим измерениям. В противном случае, граница может быть установлена некорректно или возникнет ошибка.
    
    // Пример для последовательности с измерением "Организация"
    // Предположим, у нас есть Момент и СсылкаНаОрганизацию
    // Последовательности.ПартионныйУчет.УстановитьГраницу(Момент, СсылкаНаОрганизацию);
    

    Для стандартной конфигурации УТ 10.3 последовательность "ПартионныйУчет" обычно не имеет измерений, но это важно помнить для других последовательностей или если ваша конфигурация дорабатывалась.

  2. Перемещение границы назад: Сдвигать границу последовательности назад, безусловно, возможно. Однако, если у последовательности есть измерения, это может потенциально привести к дублированию записей времени в колонке "Актуально", что может вызвать трудности в дальнейшем анализе. При отсутствии измерений это обычно не проблема.
  3. Производительность: Операция по установке границы последовательности, особенно если она затрагивает большой объем данных, может быть ресурсоемкой. Мы не рекомендуем выполнять сдвиг границы при активной работе пользователей или оперативном проведении документов, так как это может привести к блокировкам и снижению общей производительности системы. Эту операцию лучше выносить в нерабочее время или в регламентные задания.
  4. Последовательность после свертки базы: Мы помним, что проблема возникла после свертки базы. При свертке базы старые документы удаляются, а формируются документы ввода остатков на определенную дату. Критически важно, чтобы после свертки остатки по товарному и партионному учету совпадали и были корректны на дату свертки. Если свертка была выполнена некорректно, одной лишь установкой границы проблему не решить; потребуется дополнительная корректировка остатков.
  5. Дата запрета изменений: Чтобы избежать новых нарушений хронологии и сдвигов последовательности в дальнейшем, мы настоятельно рекомендуем установить дату запрета изменения данных. Это не позволит пользователям изменять, проводить или удалять документы до указанной даты, тем самым "закрепляя" корректное состояние учета.
  6. Восстановление последовательности: После установки новой границы может потребоваться восстановление последовательности документов, начиная с этой новой границы. Это может быть трудоемким процессом, особенно если были ошибки. В некоторых случаях применяют частичное восстановление последовательности каждую ночь, чтобы поддерживать актуальное состояние.

Заключение

Простое изменение даты начала проведения по партиям через установку границы последовательности эффективно только после тщательной подготовки базы, включающей исправление всех существующих ошибок партионного учета и, возможно, корректной свертки. Мы должны подходить к этой задаче комплексно, обеспечивая чистоту данных до новой границы и используя предложенные нами механизмы 1С для ее установки.

Помните, что аккуратность и внимание к деталям на каждом этапе работы с последовательностями являются залогом успешного и стабильного учета в вашей системе 1С:Управление торговлей 10.3.

← На главную