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




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

А своими словами:
Момент времени - комбинация даты и ссылки на документ. Позволяет разделить и упорядочить документы в пределах одной секунды, выстраивая все документы в однозначную последовательность. Получение данных при проведении на момент времени гарантирует, что будут учтены движения сделанные в ту же секунду что и проводимый документ, но находящиеся перед ним.
Но есть особенность - документы проведенные в одну и ту же секунду располагаются в произвольном порядке, а не в порядке их физического создания (как было в 7.7).

МоментВремени() - это момент непосредственно ПЕРЕД позицией документа (аналог РассчитатьРегистрыНа(ТекущийДокумент() в 7-рке), а если необходимо получить момент непосредственно после позиции документа, то используйте объект Граница
Код 1C v 8.х МоментСразуПослеДокумента = Новый Граница(ДокументСсылка,ВидГраницы.Включая)

Код 1C v 8.х // Пример создает момент времени по дате и ссылке на объект в базе данных.
Момент = Новый МоментВремени(ТекДокумент.Дата, ТекДокумент.Ссылка);

При получение остатков:
"Момент времени" - виртуальное поле, не хранится в базе данных. Содержит объект МоментВремени (который включает в себя ДАТУ и ССЫЛКУ НА ДОКУМЕНТ)
<Виртуальная> таблица остатков не хранится в БД, а строится в момент обращения к ней.
1. подбирается больший или равный значению ПАРАМЕТР момент времени, на который РАССЧИТАНЫ остатки
2. на этот момент получаются остатки из таблицы итогов
3. если момент времени, на который считаются остатки, не совпадает с моментом времени итогов, то остатки ДОСЧИТЫВАЮТСЯ по движениям.

Граница:
Предназначен для получения и хранения границы некоторого интервала значений. Содержит граничное значение интервала, а также признак включения или исключения граничного значения в интервал.
Используется в качестве значений свойств и параметров методов других объектов, имеющих тип Граница.
Граница используется в тех случаях, когда важно указание включения или исключения граничного значения, например при получении остатков и оборотов регистров накопления, срезов и значений регистров сведений, для задания интервалов запросов.

ВидГраницы - Определяет набор видов границ по отношению к граничному значению:
ВидГраницы.Включая - Граница включает граничное значение.
ВидГраницы.Исключая - Граница исключает граничное значение.
Код 1C v 8.х Граница = Новый Граница(Дата, ВидГраницы.Включая);
Запрос.УстановитьПараметр("КонГраница", Граница);

Пример получения остатков на дату документа, включая его движения
Запрос.Текст =
"ВЫБРАТЬ

|ИЗ

Запрос.УстановитьПараметр("МомВрем", Новый Граница(МомВрем.МоментВремени(), ВидГраницы.Включая));

Пример получения остатков на дату документа, но до его движений
Код 1C v 8.х Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ВзаиморасчетыСРаботникамиОрганизацийОстатки.Физлицо,
| ВзаиморасчетыСРаботникамиОрганизацийОстатки.СуммаВзаиморасчетовОстаток
|ИЗ
| РегистрНакопления.ВзаиморасчетыСРаботникамиОрганизаций.Остатки(&МомВрем, Физлицо = &Физик) КАК ВзаиморасчетыСРаботникамиОрганизацийОстатки";
МомВрем = Документы.НачислениеЗарплатыРаботникамОрганизаций.НайтиПоНомеру("00012","31.12.2009 23:59:59");
Запрос.УстановитьПараметр("МомВрем", Новый Граница(МомВрем.МоментВремени(), ВидГраницы.Исключая));
// или так: Запрос.УстановитьПараметр("МомВрем", МомВрем.МоментВремени());
Запрос.УстановитьПараметр("Физик", Справочники.ФизическиеЛица.НайтиПоКоду("365"));
ВывестиРезультат(Запрос.Выполнить());

Информация взята с сайта

Имея достаточный опыт внедрения УПП, хочу отметить, что на каждом проекте рано или поздно приходилось переводить бухгалтерию как отдел на работу в программе . Трудностей в этом процессе возникает достаточно. В особенности хотелось бы отметить переход из БП 2.0 на УПП. Несмотря на то, что уже вышла БП 3.0, я думаю, этот вопрос еще какое-то время останется популярным. Итак, в чем же заключается трудность?

Начинать надо с того, что в 1.3 бухгалтерия ближе к бухгалтерии предприятия редакции 1.6, нежели к 2.0, хотя конечно же весь функционал соответствует современным реалиям. Тем не менее это воспринимается как возврат к чему-то старому, морально устаревшему. И самое главное, в этом есть изрядная доля истины.

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

Отличия 1С УПП от 1С Бухгалтерии

Основные негативные моменты, которые отличают УПП от БП, с которыми мне пришлось столкнуться на практике:

  • Формирование счета-фактуры по ссылке (в БП данный счета-фактуры заносятся на отдельной вкладке).
  • Внешний вид отчетов (бухгалтерские отчеты в УПП выглядят безусловно уныло в отличие от красивых, с зеленой шапкой и множеством настроек, отчетов в БП).
  • Отличие журналов документов (различаются как названия, так и состав журналов документов, к которым привыкли бухгалтеры в БП).
  • Наличие дополнительных полей поиска на формах журналов документов.

Получите 267 видеоуроков по 1С бесплатно:

Теперь следует поговорить подробнее об этих и других технических возможностях, которые могут повлиять на учет. А также, какие альтернативы предлагает нам 1С УПП.

Самым главным отличием в принципах ведения учета в УПП и БП для бухгалтера, на мой взгляд, является невозможность (возможно, очень ограниченное количество) отражения хозяйственных операций «Бухгалтерскими справками». В некоторых компаниях половина учета построена на использовании «Операций». Такая особенность вытекает из широкого использования в УПП учетных регистров, а не только регистров бухучета. В УПП подавляющее большинство операций проводится специализированными документами.

Пример: большинство бухгалтеров отражают процент по выданным кредитам с помощью операции, указывая корреспонденцию Дт91 Кт76, однако в 1С УПП такой подход не затронет, например, регистр взаиморасчетов с контрагентами. Следует использовать документ реализация товаров и услуг.

Отдельно стоит сказать о том, что возможность использовать документ Операция есть, однако только в совокупности с документом Корректировка регистров, а этот документ способен ввести в ступор любого неподготовленного пользователя.

Далее следует отметить различия учета субконто у некоторых счетов учета и невозможность получения интересующей информации стандартными способами. Например, счет 60 не имеет третьего субконто «Документы расчетов с контрагентом», по которому в БП отражается документ Регистратор, соответственно, не получится увидеть эти документы, используя стандартную оборотно-сальдовую ведомость. Отчасти выходом из сложившейся ситуации является использование отчета «Ведомость по взаиморасчетам с контрагентами».

Отсутствие некоторых «забалансовых» счетов в 1С УПП, например, счета МЦ. Действительно, материалы в эксплуатации учитываются в БП на счете МЦ. В УПП информация о переданных в эксплуатацию материалах учитывается в регистре «Материалы в эксплуатации», информацию о них можно получить, используя отчет «Ведомость по материалам в эксплуатации».

Отсутствие процедуры закрытия месяца, такой близкой и понятной. Да, такая обработка отсутствует в УПП. Закрытие месяца осуществляется с помощью бизнес-процесса «Процедура закрытия месяца», который использует элемент справочника «настройка закрытия месяца».

Возможно, этот пункт является совсем частным случаем. Тем не менее стоит его отметить. Документ «Перемещение ОС» — трудность здесь состоит в том, что в бухгалтерии указывается, откуда и куда перемещается объект основных средств, а в УПП указывается только место, куда перемещается объект. Настоящее местоположение объекта определяется записью регистра на данный момент времени.

Отчет Ведомость амортизации в УПП имеет иное представление и не отражает движение по перемещению основных средств, альтернативно можно использовать модернизированный отчет.

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

Пути выхода из сложившейся ситуации

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

В одной компании была очень сильна позиция бухгалтерии, им жутко не нравился возврат в прошлое на 1С УПП 1.3, проект был под угрозой срыва… К счастью, у компании были отличные финансовые возможности… Итогом стала полная переписка всех бухгалтерских отчетов и приведение их к виду БП 2.0, добавление новых документов в журналы документов, вывод форм поиска на формы журналов документов. Вышло дорого: и в плане разработки, и в плане дальнейшего сопровождения, но бухгалтерия почувствовала свою значимость, и проект продолжился.

Хотя этот вариант и не представляется очень эффективным, однако он имеет место в жизни.

Диаметрально противоположенным решением будет жесткое указание руководства использовать только имеющийся функционал. Он, кстати сказать, позволяет вести бухгалтерский учет полностью, обладает всеми механизмами контроля. Такой подход оптимален для компании!

Для внедренцев, которые работают с типовыми или собственными конфигурациями – и тех, кто готовится к Аттестации на 1С:Специалист по платформе.

В статье мы разберем:

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

Время на прочтение – 20 минут.

Итак, две методики контроля остатков в 1С:Предприятии 8.3

Давайте начнем с того, что обозначения “старая методика” и “новая методика” достаточно условны. В самом деле, если “новая методика” используется с 2010 года – она уже не очень новая:)

Однако, мы еще раз вынуждены на этом остановиться, потому что различать эти подходы нужно и это имеет критическое значение .

“Старая методика” – это подход к контролю остатков, который использовался со времен «1С:Предприятие 8.0».

C 2010 года, с развитием платформы и добавлением новых возможностей с «1С:Предприятие 8.2» – применяется “новая методика” (однако – не везде ).

В чем разница?

Принципиальная разница – в моменте контроля остатков:

  • В “старой” методике остатки контролируются ДО записи движений в регистры.
    Сначала проверяем остатки, если остатков “не хватает” (будут возникать отрицательные остатки) – проводить документ не будем
  • В “новой” методике – контроль происходит ПОСЛЕ записи движений, то есть постфактум.
    Если после проведения образовались отрицательные остатки – нужно «откатить» транзакцию, то есть отменить проведение документа.

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

Ok, значит, старая методика ушла в прошлое и это удел УТ 10.3?

Нет, это не совсем так.

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

Например, когда количество для списания известно из табличной части документа. Проблема возникает с себестоимостью, ведь её нужно рассчитать до записи в регистр, то есть выполнить запрос к базе данных.

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

Например, вот так:

Однако встречаются конфигурации, где и количество, и стоимость учитываются на одном регистре. И вот здесь-то обоснованно остается работать старая методика контроля остатков !

Вот пример одного регистра и для количества, и для себестоимости:

А что насчет типовых конфигураций? Там ведь только новая методика, верно?

Не всегда!

Вот, например, в «1C:Управление торговлей 11.3» есть 2 регистра:

При проведении документов отгрузки регистр «Себестоимость товаров» не заполняется вообще. Данные в этот регистр попадают только при выполнении регламентных операций по закрытию месяца.

В УТ 11 используется новая методика , так как все данные для проведения документов можно получить, не обращаясь к контролируемым регистрам.

Что касается «1C:Бухгалтерии», то там и количество, и себестоимость хранятся в одном регистре бухгалтерии, на соответствующих счетах БУ.

Поэтому в БП 3.0 используется старая методика .

Обратите внимание, что количественный и стоимостной учет в УТ 11 ведутся с разной аналитикой. Например, себестоимость дополнительно ведется в разрезе организации, подразделения, менеджера, виды деятельности НДС и так далее.

В рамках текущей статьи мы разберем блокировки и для старой, и для новой методики контроля остатков.

Про оперативное проведение документов

В этом простом вопросе часто встречаются заблуждения.

Иногда считают, что оперативное проведение – это контроль остатков по новой методике. Это не так, от слова «совсем».

Оперативное проведение можно анализировать при контроле остатков, но не обязательно.

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

Настраивается оно с помощью специального свойства документа:

Что значит «регистрировать здесь и сейчас»? Платформа для оперативно проводимых документов выполняет ряд действий:

  • Документам, проводимым сегодня, присваивается текущее время
  • Если два документа проводятся одновременно, каждый будет иметь свое время (то есть система разнесет документы по разным секундам)
  • Документы нельзя будет провести будущей датой.

Но главное другое – система передает признак оперативности проведения документа в обработку проведения:

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

Актуальные остатки хранятся в системе и получаются максимально быстро (остатки на другие даты в большинстве случаев получаются расчетным путем).

Таким образом оперативное проведение можно принять и для старой, и для новой методики контроля остатков .

Интересный факт.

В УТ 11 документам, списывающим номенклатуру, запрещено проводиться оперативно. Например, это документы «Реализация товаров и услуг», «Сборка товаров», «Перемещение товаров», «Внутреннее потребление товаров» и другие.

Почему так сделано?

В системе контроль остатков всегда выполняется на актуальный момент времени (параметр Период в запросе не задается). А отсутствие оперативного проведения позволяет вводить документы будущим числом, такая задача часто требуется клиентам.

Контроль остатков по новой методике – без блокировок

Коротко рассмотрим алгоритм контроля остатков при проведении документа «Реализация товаров и услуг» на модельной конфигурации.

Есть два регистра:

  • Свободные остатки – для количественного учета
  • Себестоимость товаров – для учета себестоимости

Для контроля остатков товаров достаточно работы с регистром «Свободные остатки».

Код обработки проведения будет выглядеть таким образом:

Запрос = Новый Запрос;


#Область Область1
Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
#КонецОбласти


#Область Область2
Запрос.Текст =
"ВЫБРАТЬ

|ПОМЕСТИТЬ ТоварыДокумента
|ИЗ
|ГДЕ
|
|СГРУППИРОВАТЬ ПО
|
|ИНДЕКСИРОВАТЬ ПО
| Номенклатура
|;

|ВЫБРАТЬ
| &Дата КАК Период,
| ЗНАЧЕНИЕ(ВидДвиженияНакопления.Расход) КАК ВидДвижения,
| ТоварыДокумента.Количество КАК Количество
|ИЗ
";
Запрос.УстановитьПараметр("Дата", Дата);
#КонецОбласти

// 4. Запись движений в БД
#Область Область4
Движения.Записать();
#КонецОбласти


#Область Область5
Запрос.Текст =
"ВЫБРАТЬ
| -СвободныеОстаткиОстатки.КоличествоОстаток КАК Дефицит
|ИЗ
| ТоварыДокумента КАК ТоварыДокумента
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрНакопления.СвободныеОстатки.Остатки(
| &МоментВремени,
| Номенклатура В
| (ВЫБРАТЬ
| ТоварыДокумента.Номенклатура КАК Номенклатура
| ИЗ
| ТоварыДокумента КАК ТоварыДокумента)) КАК СвободныеОстаткиОстатки
| ПО ТоварыДокумента.Номенклатура = СвободныеОстаткиОстатки.Номенклатура
|ГДЕ
| СвободныеОстаткиОстатки.КоличествоОстаток < 0";
#КонецОбласти


#Область Область6
МоментКонтроляОстатков =
?(Режим = РежимПроведенияДокумента.Оперативный,
Неопределено,
Новый Граница(МоментВремени(), ВидГраницы.Включая));
Запрос.УстановитьПараметр("МоментВремени", МоментКонтроляОстатков);
РезультатЗапроса = Запрос.Выполнить();
#КонецОбласти


#Область Область7
Если НЕ РезультатЗапроса.Пустой() Тогда
Отказ = Истина;
ВыборкаОшибки = РезультатЗапроса.Выбрать();
Пока ВыборкаОшибки.Следующий() Цикл
Сообщение.Текст = "Недостаточно товара в количестве: "+ВыборкаОшибки.Дефицит;
Сообщение.Поле = "Товары["+(ВыборкаОшибки.НомерСтроки-1)+"].Количество";
Сообщение.Сообщить();
КонецЦикла;
КонецЕсли;
#КонецОбласти


#Область Область8
Если Отказ Тогда
Возврат;
КонецЕсли;
#КонецОбласти

КонецПроцедуры

Рассмотрим ключевые точки алгоритма контроля остатков.

1. Инициализация менеджера временных таблиц

Менеджер будет необходим, чтобы созданная в запросе временная таблица была доступна и в следующих запросах.

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

2. Запрос, группирующий данные табличной части

В запросе выбираются сгруппированные данные табличной части.

Обратите внимание, что выбирается и номер строки документа – он потребуется для контекстной привязки сообщения об ошибке. Для номера строки используется агрегатная функция МИНИМУМ() – то есть сообщение будет привязано к первой строке, где встречается указанная номенклатура.

В первом запросе пакета создается временная таблица. Во втором запросе выбираются данные временной таблицы и добавляются 2 поля, необходимые для каждой записи регистра – Период и ВидДвижения.

Плюсы такого подхода:

  • Не нужно выполнять предварительную очистку, то есть использовать метод Очистить()
  • Не нужно организовывать цикл по выборке или табличной части.

Кстати, подобный подход используется в типовых конфигурациях, в частности, в УТ 11 и БП 3.0.

4. Запись движений в БД

Запись можно было бы выполнить одной командой (вместо двух) – Движения.СвободныеОстатки.Записать().

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

Но более универсальным является такой подход:

  • Вначале установить флаг Записывать у необходимых наборов записей регистров
  • Затем вызывать метод Записать() коллекции Движения, который записывает в БД все наборы с установленным флагом Записывать

После выполнения команды «Движения.Записать()» флаг Записывать у всех наборов сбросится в Ложь.

Также нужно помнить, что в конце транзакции (после ОбработкиПроведения) система автоматически запишет в БД только те наборы записей, у которых флаг Записывать установлен в значение Истина.

В типовых решениях используется подобная схема для записи движений. Почему?

Метод Записать() коллекции Движения записывает наборы записей в одинаковой последовательности даже для разных документов.

Запись же движений вручную может привести к проблемам.

Приведем пример.

Если в документе «Реализация» выполнить запись так:

Движения.СвободныеОстатки.Записать();
...
Движения.СебестоимостьТоваров.Записать();

А в документе «Перемещение товаров» изменить порядок:

Движения. СебестоимостьТоваров.Записать();
...
Движения. СвободныеОстатки.Записать();

То это может привести к взаимоблокировке документов на пересекающихся наборах номенклатуры.

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

5. Запрос, получающий отрицательные остатки

В запросе выбираются отрицательные остатки по номенклатуре из документа.

Отрицательный остаток – это и есть нехватка (дефицит) товара.

Соединение с товарами из документа выполняется только для получения номера строки.

Если бы мы не планировали делать привязку сообщений к полям документа, запрос можно сильно упросить – будут получаться данные из одной таблицы (остатков регистра).

6. Определение момента времени для контроля остатков

Вот здесь нам пригодилось оперативное проведение.

Если документ проводится оперативно, то момент для получения остатков – Неопределено, что означает получение актуальных остатков.

Если это неоперативное проведение, то мы получаем момент времени «после» документа – чтобы учесть только что сделанные движения.

Напомним, что получение актуальных остатков – быстрая операция по сравнению с получением остатков на произвольным момент времени.

Именно в этом и заключается выигрыш оперативно проводимых документов.

7. Если запрос не пустой, значит, образовались отрицательные остатки

В цикле обходим все отрицательные остатки и выводим сообщение привязанной к строкам табличной части.

Вот так будет выглядеть диагностическое сообщение:

8. Если есть ошибки, то возвращаемся из обработчика события

Если была хоть одна ошибка – выходим из процедуры.

Поскольку нет смысла продолжать проведение, транзакция всё равно не будет зафиксирована (а дальше у нас будет разработан код по списанию партий).

Реализация списания себестоимости по партиям

После того, как проверка остатков прошла успешно, можно приступать к списанию партий.

Код для списания по FIFO будет таким:

// I. Анализ смещения даты документа вперед


И НЕ ЭтотОбъект.ЭтоНовый()
И ЭтотОбъект.Проведен Тогда

Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Документ.Дата КАК Дата
|ИЗ
|ГДЕ

РезультатЗапроса = Запрос.Выполнить();
ВыборкаДокумент.Следующий();

Иначе
Ложь);
КонецЕсли;

КонецПроцедуры

Процедура ПриЗаписи(Отказ)

ЭтотОбъект.ДополнительныеСвойства.Вставить("ДатаДокументаСдвинутаВперед",
ЭтотОбъект.Дата>


КонецЕсли;

КонецПроцедуры

Процедура ОбработкаПроведения(Отказ, Режим)

Запрос = Новый Запрос;

// 1. Инициализация менеджера временных таблиц
#Область Область1
...
#КонецОбласти

// 2. Запрос, группирующий данные табличной части
#Область Область2
...
#КонецОбласти

// 4. Запись движений в БД
#Область Область4
...
#КонецОбласти

// 5. Запрос, получающий отрицательные остатки
#Область Область5
...
#КонецОбласти

// 6. Определение момента времени для контроля остатков
#Область Область6
...
#КонецОбласти

// 7. Если запрос не пустой, значит образовались отрицательные остатки
#Область Область7
...
#КонецОбласти

// 8. Если есть ошибки, то возвращаемся из обработчика события
#Область Область8
...
#КонецОбласти

// II. Подготовка наборов записей регистра "Себестоимость товаров"
#Область ОбластьII

Движения.Записать();
КонецЕсли;
Движения.СебестоимостьТоваров.Записывать = Истина;
#КонецОбласти

// III. Запрос получающий остатки партий для списания по FIFO
#Область ОбластьIII
Запрос.Текст =
"ВЫБРАТЬ
| ТоварыДокумента.Номенклатура КАК Номенклатура,
| ТоварыДокумента.НомерСтроки КАК НомерСтроки,

| Остатки.Партия КАК Партия
|ИЗ
| ТоварыДокумента КАК ТоварыДокумента
| &МоментВремени,
| Номенклатура В
| (ВЫБРАТЬ
| ИЗ

|УПОРЯДОЧИТЬ ПО
|ИТОГИ
| МАКСИМУМ(Количество),
| СУММА(КоличествоОстаток)
|ПО
| Номенклатура";
РезультатЗапроса = Запрос.Выполнить();
#КонецОбласти

// IV. Цикл по номенклатуре документа
#Область ОбластьIV

// V. Получим количество для списания
// VI. Цикл по партиям по FIFO
Пока ВыборкаПартии.Следующий() И ОсталосьСписать>0 Цикл
// VII. Проверка на нулевой остаток
Если ВыборкаПартии.КоличествоОстаток=0 Тогда
Продолжить;
КонецЕсли;
Движение.Период = Дата;

// VIII. Расчет количества и суммы для списания

// IX. Уменьшим количество для списания
КонецЦикла;
КонецЦикла;
#КонецОбласти

КонецПроцедуры

Разберем ключевые точки алгоритма списания партий по FIFO.

I. Анализ смещения даты документа вперед

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

Для анализа сдвига даты документа потребуется 2 события:

  • Перед записью – для получения старой даты документа и проверки режима проведения документа
  • При записи – для получения новой даты документа

Данные между событиями передаем через специальную коллекцию объекта – «ДополнительныеСвойства». Она существует пока текущая версия объекта находится в памяти, то есть доступна для всех событий при проведении.

Похожий прием используется в типовой «1С:Бухгалтерии 8». Но там используется одно событие «Перед записью».

Почему в БП не нужно задействовать «При записи»?

Всё просто – документы отгрузки в бухгалтерии не могут проводиться оперативно. А это значит, что время документа не будет принимать оперативную отметку (если документ перепроводится текущим днем), поэтому и старую и новую дату документа можно получить в событии «Перед записью».

II. Подготовка наборов записей регистра «Себестоимость товаров»

Для документа установлен режим удаления движений – “При отмене проведения”:

Таким образом, есть вероятность, что при перепроведении мы можем учесть движения самого документа. НО произойдет это только в случае сдвига даты документа вперед. То есть очистку движений имеет смысл делать только при сдвиге даты документа вперед.

Приведем пример:

  • Остаток мониторов LG на момент проведения документов – 10 шт.
  • Проводится документ, который списывает 8 шт.
  • В этом же документе время увеличивается на 1 минуту, перепроводим

Если не будет удаления старых движений, то система сообщит о нехватке 6 мониторов, поскольку текущие движения документа уже списали 8 из 10 имеющихся мониторов.

Примечание. Иногда встречается совет – удалять движения только при оперативном проведении.

Но это неправильно: ситуации изменения «неоперативных» документов (вчерашних и более ранних) они не учтут.

То есть проблема «нехватки 6 мониторов» (см. выше) будет в этом случае решена только для документов изменяемых сегодняшним числом.

III. Запрос, получающий остатки партий для списания по FIFO

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

На уровне итогов получается количество из документа – МАКСИМУМ(Количество) и остаток партии – СУММА(КоличествоОстаток).

Как Вы думаете, может ли количество из документа превышать суммарный остаток номенклатуры по всем партиям?

Если движения по регистрам “СвободныеОстатки” и “СебестоимостьТоваров” по количеству делаются синхронно (и приход, и расход), то такой ситуации возникнуть не может. На это мы и будем закладываться при списании партий.

IV. Цикл по номенклатуре документа

Благодаря итогам в запросе во внешнем цикле обходим номенклатуру из документа.

V. Получим количество для списания

Запомним, какое количество нужно списать. Далее это количество будет уменьшаться.

VI. Цикл по партиям по FIFO

Вложенный цикл будет содержать партии по текущей номенклатуре.

VII. Проверка на нулевой остаток

Вообще ситуация, когда остаток партии нулевой, является ошибкой в данных системы (тем не менее, такая ситуация возможна). Дело в том, что в этом случае сумма НЕ нулевая (виртуальная таблица остатков регистра не возвращает записи с нулевыми значениями ресурсов).

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

VIII. Расчет количества и суммы для списания

Количество для списания - это минимальное значение между остатком партии и тем, что осталось списать.

Сумма рассчитывается элементарной пропорцией.

Если списывается весь остаток партии, то будет списана и вся сумма этой партии. Это математика 3-го класса церковно-приходской школы: Х*Y/X = Y:)

То есть НЕ нужно делать дополнительных проверок (иногда дают такой совет) на то, что списывается все количество. Этот совет даже имеет своё название – «проблема копеек ».

А тем, кто дает вредные советы имеет смысл заглянуть в конфигурацию «1С:Бухгалтерия 8». Там (о, ужас!) нет проверки на то, что списывается партия целиком:)

Вот скрин общего модуля «Учет товаров», метод «СписатьОстаткиТоваров»:

IX. Уменьшим количество для списания

Нужно понять, сколько еще осталось списать. Для этого вычтем количество из движения регистра.

Зачем нужны управляемые блокировки?

Вот мы и дошли до управляемых блокировок.

Казалось бы, представленные выше алгоритмы работают, как часы. Можете сами их потестировать (ссылки на выгрузки баз в конце статьи).

Но при реальной многопользовательской эксплуатации начнутся проблемы, причем, как это часто бывает, проблемы будут обнаружены не сразу…

Приведем пример наиболее типичной проблемы при списании товара, когда 2 пользователя практически одновременно пытаются списать товар (оформить продажу):

В этом примере два пользователя почти одновременно проводят продажу товаров – документ №2 начал проводиться чуть позже документа 1.

При получении остатка система сообщает, что остаток 10 шт., и оба документа успешно проводятся. Печальный итог – на складе минус 5 мониторов LG.

Но при этом контроль остатков работает! То есть, если документ №2 будет проводиться после окончания проведения документа №1, система не проведет документ №2:

Иногда встречается заблуждение – «У меня в базе одновременно работают только 3-4 пользователя, вероятность параллельного проведения документов равна нулю, поэтому на блокировки можно не отвлекаться».

Это очень опасное рассуждение .

Даже, два пользователя могут проводить документы практически одновременно, например, если один из них выполняет групповое проведение документов.

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

Как решить проблему при параллельном проведении документов?

Решение простое – заблокировать мониторы LG в момент времени Т1, так чтобы другие транзакции не могли обратиться к остаткам по этому товару.

Тогда в момент времени Т2 система будет ждать, когда монитор LG будет разблокирован. И после этого система получит актуальный остаток товаров и будет выполнено (или не выполнено) списание товаров.

Буквально пару слов о классификации блокировок.

Существует 2 типа блокировок:

  • Объектные
  • Транзакционные .

Если говорить просто, то объектные блокировки не позволяют интерактивно изменить двум пользователям один объект (элемент справочника или документ).

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

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

Когда нужно накладывать блокировки?

Задача установки блокировок становится актуальной, как только в базе начинает работать более одного пользователя .

Блокировки нужно устанавливать в транзакциях, а когда возникают транзакции? Правильно, самый частый случай – проведение документов.

То есть блокировки нужно накладывать при проведении всех документов?

Ни в коем случае. Устанавливать блокировки «на всякий случай» точно не стоит . Ведь сами по себе блокировки снижают параллельность работы пользователей (масштабируемость системы).

Блокировки нужно накладывать на ресурсы (строки таблицы), которые читаются и изменяются в транзакциях. Например, при проведении документов.

В примере выше таким ресурсом является остаток по товару. Система должна была заблокировать остаток с момента получения данных об остатке (Т1) до окончания транзакции (Т3).

Примечание. Транзакция при проведении документа №1 начинается раньше, чем момент получения остатков. Но для простоты считаем, что Т1 – и время начала проведения документа, и момент получения остатков.

Пример, когда не нужно накладывать блокировку – проведение документа «Поступление товаров». В этом случае нет никакой конкуренции за ресурсы (остатки, …), поэтому блокировка будет вредна: она уменьшит масштабируемость системы.

Автоматические и управляемые блокировки

Здесь мы не будем вдаваться в теорию (это тема отдельной статьи), а скажем лишь, что управляемые блокировки являются более оптимальными.

Вместо теории можем привести пруф – все современные типовые конфигурации работают на управляемых блокировках.

Поэтому в нашей модельной конфигурации будет выбран соответствующий режим:

Управляемые блокировки в новой технологии контроля остатков

Блокировку будем накладывать на регистр “Свободные остатки” и только на номенклатурные позиции, встречающиеся в документе.

Причем правильный вариант наложения блокировки – как можно позднее.

В новой методике контроля остатков это нужно сделать перед записью (или в момент записи) движений в регистр “Свободные остатки”, чтобы другие транзакции не смогли изменить этот разделяемый ресурс.

Блокировку можно накладывать вручную (программным образом) и чуть позже мы покажем, как это делается.

Но дополнительный бонус новой технологии контроля остатков в том, что для блокировки разделяемых ресурсов нужна лишь одна строка кода.

Нужно просто установить свойство БлокироватьДляИзменения у набора записей регистра:

// 3.1. Блокировка остатков регистра
#Область Область3_1
Движения.СвободныеОстатки.БлокироватьДляИзменения = Истина;
#КонецОбласти

// 4. Запись движений в БД
#Область Область4
Движения.СвободныеОстатки.Записывать = Истина;
Движения.Записать();
#КонецОбласти
...

В результате 2 транзакции не смогут изменять свободные остатки по одной номенклатуре.

На самом деле при свойство БлокироватьДляИзменения не устанавливает управляемую блокировку , оно лишь выключает режим разделения итогов регистра при записи.

Но для нашей статье принципиально следующее – система установит блокировку на комбинацию записываемых в регистр данных. А детально работу свойства БлокироватьДляИзменения мы рассмотрим в отдельной статье.

Кстати, в типовой УТ 11 не так-то просто найти установку свойства БлокироватьДляИзменения для регистра “Свободные остатки”. Дело в том, что это выполняется в модуле набора записей регистра, в событии “Перед записью”.

Вот и всё, одной строкой кода была обеспечена корректная работа системы!

Важно . Мы не накладываем блокировку на регистр “Себестоимость товаров”.

Почему? Такая блокировка являлась бы излишней (а это определенная нагрузка на сервер 1С), поскольку движения в регистры “Свободные остатки” и “Себестоимость товаров” выполняются всегда синхронно, то есть последовательно друг за другом.

Поэтому, заблокировав товары из “Свободных остатков”, мы не допустим другие транзакции до этих товаров и в регистре “Себестоимость товаров”.

Но для старой методики контроля остатков блокировка будет накладываться по-другому. Для начала разберем алгоритм партионного списания для этого случая.

Старая методика контроля остатков

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

Пусть это будет регистр “Себестоимость товаров”:

Тогда алгоритм проведения документа “Реализация товаров” будет выглядеть вот так:

// 1. Обработчик события "Перед записью"
Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)

Если РежимЗаписи = РежимЗаписиДокумента.Проведение
И НЕ ЭтотОбъект.ЭтоНовый()
И ЭтотОбъект.Проведен Тогда

Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Документ.Дата КАК Дата
|ИЗ
| Документ.РеализацияТоваровУслуг КАК Документ
|ГДЕ
| Документ.Ссылка = &Ссылка";
Запрос.УстановитьПараметр("Ссылка", ЭтотОбъект.Ссылка);
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДокумент = РезультатЗапроса.Выбрать();
ВыборкаДокумент.Следующий();

ЭтотОбъект.ДополнительныеСвойства.Вставить("СтараяДатаДокумента", ВыборкаДокумент.Дата);

Иначе
КонецЕсли;

КонецПроцедуры

Процедура ПриЗаписи(Отказ)

Если НЕ ЭтотОбъект.ДополнительныеСвойства.Свойство("ДатаДокументаСдвинутаВперед") Тогда

ЭтотОбъект.ДополнительныеСвойства.Вставить("ДатаДокументаСдвинутаВперед",
ЭтотОбъект.Дата>ЭтотОбъект.ДополнительныеСвойства.СтараяДатаДокумента);

Сообщить(ЭтотОбъект.ДополнительныеСвойства.ДатаДокументаСдвинутаВперед);
КонецЕсли;

КонецПроцедуры

Процедура ОбработкаПроведения(Отказ, Режим)

// 2. Удаление "старых" движений документа
Если ДополнительныеСвойства.ДатаДокументаСдвинутаВперед Тогда
Движения.СебестоимостьТоваров.Записывать = Истина;
Движения.СебестоимостьТоваров.Очистить();
Движения.Записать();
КонецЕсли;

// 3. Установка флага для записи движений в конце транзакции
Движения.СебестоимостьТоваров.Записывать = Истина;

// 4. Запрос, получающий остатки по партиям на момент времени документа
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| РеализацияТовары.Номенклатура КАК Номенклатура,
| СУММА(РеализацияТовары.Количество) КАК Количество,
| МИНИМУМ(РеализацияТовары.НомерСтроки) КАК НомерСтроки
|ПОМЕСТИТЬ ТоварыДокумента
|ИЗ
| Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТовары
|ГДЕ
| РеализацияТовары.Ссылка = &Ссылка
|СГРУППИРОВАТЬ ПО
| РеализацияТовары.Номенклатура
|ИНДЕКСИРОВАТЬ ПО
| Номенклатура
|;
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ТоварыДокумента.Номенклатура КАК Номенклатура,
| ТоварыДокумента.Количество КАК Количество,
| ТоварыДокумента.НомерСтроки КАК НомерСтроки,
| ЕСТЬNULL(Остатки.КоличествоОстаток, 0) КАК КоличествоОстаток,
| ЕСТЬNULL(Остатки.СуммаОстаток, 0) КАК СуммаОстаток,
| Остатки.Партия КАК Партия
|ИЗ
| ТоварыДокумента КАК ТоварыДокумента
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.СебестоимостьТоваров.Остатки(
| &МоментВремени,
| Номенклатура В
| (ВЫБРАТЬ
| Т.Номенклатура КАК Номенклатура
| ИЗ
| ТоварыДокумента КАК Т)) КАК Остатки
| ПО ТоварыДокумента.Номенклатура = Остатки.Номенклатура
|УПОРЯДОЧИТЬ ПО
| Остатки.Партия.МоментВремени
|ИТОГИ
| МАКСИМУМ(Количество),
| СУММА(КоличествоОстаток)
|ПО
| НомерСтроки";

Запрос.УстановитьПараметр("МоментВремени", МоментВремени());
Запрос.УстановитьПараметр("Ссылка", Ссылка);

РезультатЗапроса = Запрос.Выполнить();

ВыборкаНоменклатура = РезультатЗапроса.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);

// 5. Цикл по номенклатуре - проверяем достаточность количества для списания
Пока ВыборкаНоменклатура.Следующий() Цикл

ДефицитНоменклатуры = ВыборкаНоменклатура.Количество - ВыборкаНоменклатура.КоличествоОстаток;

Если ДефицитНоменклатуры>0 Тогда
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Недостаточно товара в количестве: "+ДефицитНоменклатуры;
Сообщение.Поле = "Товары["+(ВыборкаНоменклатура.НомерСтроки-1)+"].Количество";
Сообщение.УстановитьДанные(ЭтотОбъект);
Сообщение.Сообщить();
Отказ = Истина;
КонецЕсли;

Если Отказ Тогда
Продолжить;
КонецЕсли;

// 6. Получим количество для списания
ОсталосьСписать = ВыборкаНоменклатура.Количество;
ВыборкаПартии = ВыборкаНоменклатура.Выбрать();

// 7. Цикл по партиям
Пока ВыборкаПартии.Следующий() И ОсталосьСписать>0 Цикл

Движение = Движения.СебестоимостьТоваров.ДобавитьРасход();
Движение.Период = Дата;
Движение.Номенклатура = ВыборкаПартии.Номенклатура;
Движение.Партия = ВыборкаПартии.Партия;
// 9. Расчет количества для списания
Движение.Количество = Мин(ОсталосьСписать, ВыборкаПартии.КоличествоОстаток);
// 10. Расчет суммы списания
Движение.Сумма = Движение.Количество*
ВыборкаПартии.СуммаОстаток/ВыборкаПартии.КоличествоОстаток;

// 11. Уменьшим количество для списания
ОсталосьСписать = ОсталосьСписать - Движение.Количество;

КонецЦикла;
КонецЦикла;

На сегодняшний день программные продукты 1С являются неким стандартом для работы бухгалтерского, управленческого и других видов учета в малом и среднем бизнесе. Работодатели требуют от своих сотрудников обязательных навыков работы именно с этим программным продуктом. Если возникает на повестке дня вопрос интеграции интернет-магазина и систем автоматизации (остатки, цены, заявки и т.д.) – также на стороне офиса обычно оказывается база данных 1С, с которой и нужно провести интеграцию. Аналогично во многих других случаях: любой процесс автоматизации малого и среднего бизнеса традиционно начинается с продуктов 1С и продолжается с их применением.

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

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

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

С другой стороны, я все дальше и дальше ухожу от постоянной работы с продуктами 1С. Если на заре моей карьеры работа с программами 1С приносила мне 100% дохода, то сегодня внедрение каких-то 1С решений занимает в моей работе не более 20%, все остальное – это сайты, это CRM-системы и т.д.

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

Еще немного об 1С и о том, зачем я это все пишу
Я и сам знаю, что собрался, как говорится, объять необъятное. А потому – еще одно предупреждение:
  1. Я планирую создать целую серию статей об 1С, где расскажу об этом программном продукте с разных точек зрения. Эта статья предназначена, прежде всего, для программистов. А потому я размещаю ее на Хабре. Следующие будут охватывать более широкий спектр понятий, интересных в том числе, бизнесменам и пользователям программных продуктов 1С, а потому они будут размещены на Мегамозге.
  2. Я не буду углубляться в нюансы применения кода, в другие технические подробности, которые каждый из вас может самостоятельно прочитать на официальном сайте 1С, на сайтах поддержки, на известных форумах и пр.
  3. Я не буду обсуждать нюансы работы той или иной версии платформы. Более того, чаще всего я буду говорить о платформе 8.3 как о последней актуальной на момент написания статьи, а также о типовых конфигурациях, которые наиболее востребованы у моих клиентов (средний и малый бизнес).
При этом я хочу не просто помочь веб-программисту или другому специалисту понять, где искать нужный фрагмент кода, я хочу помочь разобраться с тем, что это такое – 1С.
Сегодня компания 1С своими силами внесла такое количество путаницы в описания продуктов, в требования к уровню специалистов, которые будут настраивать систему, в выбор платформы, конфигурации, плагинов, надстроек, версий и прочее, прочее, что система 1С лично мне начинает напоминать старый сериал «Спрут». Если кто-то еще помнит, то в этом фильме комиссар боролся с преступной группировкой, часть которой являлась банковская группа. И эта банковская система была настолько запутанной, что понять, откуда берутся деньги, куда они уходят, каким образом работает то или иное подразделение и главное зачем, было очень трудно.

В системе 1С усилия по «запутыванию» пользователя, как мне кажется, направлены на одно: не надо ни в чем разбираться, надо просто платить. И многие бизнесмены приходят к тому, что платят и правда, не разбираясь, надо ли им это обновление, требуется ли им этот продукт. Просто платят и все.

Я же попытаюсь распутать «щупальца Спрута» и структурирую общее понимание того, каким образом работает система 1С.

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

А если вам нужны какие-то конкретные технические нюансы работы 1С, то вы всегда можете воспользоваться следующими ресурсами:

  1. Сайт 1С и партнерский форум. http://www.1c.ru
  2. Другие ресурсы
В подавляющем большинстве случаев ответы на ваши вопросы найдутся на одном из этих ресурсов. Есть еще много форумов и прочего, но большая часть решений – именно там.

1С как экосистема

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

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

В статье я уже рассказывал, что на самом деле 1С нужно воспринимать как целую экосистему. Именно такой подход поможет понять, что такое 1С и зачем она нужна.

Итак, с точки зрения технической экосистемы 1С состоит из следующих компонентов:

  1. Платформа 1С – это та основа, на которой пишутся конфигурации, с которой работают программисты и пр. Она обновляется от версии к версии, а потому может быть: 6.0, 7.7, 8.0, 8.2 или 8.3.
  2. Конфигурация. Это следующий уровень конкретизации. Конфигурации пишутся на платформе с использованием кода 1С. Пользователи работают с конфигурациями.
  3. 1С Битрикс. Система для работы с сайтами, о ней поговорить стоит отдельно.
Еще один разрез, в котором можно структурировать работу 1С, - это организационный уровень. И здесь есть 2 части, которые также друг без друга не работают:
  1. Сама компания 1С и ее штат специалистов.
  2. Партнеры 1С (франчайзинг) и специалисты, занимающиеся обслуживанием системы. Их также стоит вныделить в качестве одной из составляющих эко-системы. Без специалистов, которые дорабатывают и внедряют 1С, система работать не будет. Это могут быть компании-партнеры 1С или одиночки-фрилансеры, не важно, они просто должны быть, иначе система не будет жизнеспособной.
Далее я предлагаю подробнее рассмотреть части эко-системы 1С.

Платформа

Платформа – это та самая основа, на которой 1С программисты, используя язык программирования 1С, пишут готовые программы (конфигурации) для пользователей. Именно платформа является той основой, без которой не будет работать ни один компонент, ни одна конфигурация. Одновременно сама платформа без конфигурации может заинтересовать исключительно 1С программиста, для всех остальных (пользователей, различных специалистов) она бесполезна.
Работать можно на разных версиях платформы. Я знаю, что на практике встречается применение версии 8.2 и 8.0, а также достаточно старой, но все еще популярной 7.7, иногда встречается даже использование первого удачного релиза 6.0. Но я буду говорить исключительно о версии 8.3, как о самой последней на момент написания статьи. Многие вещи, которые мы обсудим, одинаково актуальны и для прошлых версий. Но часть была добавлена только в последних релизах. Хотелось бы, чтобы читатели учитывали этот факт.

Важно понимать, что пользователям чаще всего не требуется весь спектр возможностей, которые дает 1С. Особенно актуально это утверждение для малого и среднего бизнеса. А вот качество и надежность работы для пользователей крайне актуальны. И в этом отношении с программными продуктами 1С, к сожалению, возникает достаточно много проблем.
Программисты при работе с 1С используют специальный язык программирования, который был создан разработчиками 1С для работы с платформой 1С. Сегодня он доступен на русском и английском языках, но изначально был написан на русском, а потому типовые конфигурации также пишутся традиционно на русском языке, хотя всегда есть возможность применить в нужном месте также и английские версии операторов, если программисту так удобнее работать. Язык этот представляет смесь бейсика и C+ с добавлением SQL для написания запросов. Кроме того, в нем предусмотрена возможность использования различных конструкторов и плагинов.

Одна из особенностей платформы 1С – это отсутствие модульности. Платформа – это нечто целое, здесь невозможно четко указать, что какой фрагмент кода (модуль) за какие возможности отвечает. Конечно, при установке вы можете указать, какие компоненты нужно установить, а какие – нет. Но эта возможность присутствует только в момент установки, и, на самом деле, предлагает совсем небольшое число вариантов.

Еще одна ремарка, которая поможет, надеюсь, избежать флейма и споров:

Я понимаю, что платформа 1С – это мощный и очень гибкий инструмент. И если вы, будучи опытным программистом 1С зададитесь целью написать на ней нечто свое, особенное, скорей всего, у вас получится прекрасное программное обеспечение. И для разных случаев здесь можно найти решение именно благодаря богатству возможностей платформы. Но я чаще всего сталкиваюсь с применением типовых конфигураций (Бухгалтерия, Управление Торговлей, Зарплата и Кадры, Управление Производством), с ними работает большинство пользователей, особенно, если говорить о малом и среднем бизнесе. А потому и о выборе платформы, и о каких-то проблемах, связанных с работой 1С я буду писать преимущественно с точки зрения работы с типовыми конфигурациями.

При этом я также понимаю, что при большом желании и достаточном уровне знаний программиста очень многие вопросы могут быть решены, а проблемы окажутся не актуальными. А потому, если вы используете какие-то уникальные разработки, проблемы и вопросы, которые я раскрываю, могут оказаться для вас совсем не интересными. Для всех остальных – продолжаю.
Варианты поставки платформы
При выборе платформы очень важно обратить внимание на варианты поставки решения. Первое, что вам важно, это метод организации работы с данными:
  • Файловое решение
  • Клиент-серверный вариант
В файловом решении вся рабочая информация будет храниться в одном общем файле. Не важно, какую из конфигураций вы при этом установите. В любом случае вы получите служебный файл с расширением CD (внутренний формат 1С), в котором будет храниться все: справочники, документы, регистры и т.д. Если число пользователей вашей программы не превышает 4 человек, скорей всего, вам вполне подойдет этот вариант. Тем более, что настраивать файловую систему значительно проще, здесь можно даже обойтись без помощи 1С-специалиста. Отчасти проблему скорости работы можно решить при помощи RPD (Remote Desktop Protocol - протокол удалённого рабочего стола), но только отчасти.

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

Для решения этой проблемы компания 1С пытается примерять кэширование данных, но этот метод пока что приносит еще больше проблем. Если кому-то интересна эта тема, достаточно набрать в поисковой системе «проблемы кэша 1С», в поиске будет очень много форумов и обсуждений по этому поводу с самыми разными проблемами, которые в итоге сводятся к тому, что кэширование работает не всегда корректно.

Клиент-серверная организация хранения данных – это организация баз данных в таблицах на сервере. Это могут быть MSSQL, Oracle или другой вариант организации баз данных.

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

В большинстве случаев в компаниях устанавливают Windows сервер, на котором хранится и сама программа, и базы данных. Иногда приложения и базы данных разделяют по разным серверам, но это случаи сложные и достаточно редкие, а потому я останавливаться на них не буду.

Версии 1С для разных платформ
Сегодня вы можете выбрать разные версии программного обеспечения 1С для работы на различных платформах. Здесь также стоит разобраться, что стоит покупать в каком случае.

Итак, существуют версии 1С:

  • для Windows,
  • для Linux.
Для Mac OS на момент написания статьи версии не разработано.

Программу 1С, которая работает под Windows, разрабатывали с самого начала, это мощный привычный всем инструмент, который достаточно доработан, чтобы пользоваться им без особых проблем. Версия под Linux на сегодняшний день считается еще новой, а потому достаточно «сырой», в ней пока еще имеется очень много ошибок, как и в любом новом программном продукте.

Предприниматели и любые представители бизнеса – люди достаточно консервативные, им важней всего – стабильная надежная работа. Чаще всего бизнесу не столь важна высокая скорость работы или огромный перечень возможностей, сколько требуется просто стабильная работа. Кроме того, Linux на сегодня не слишком востребован в отечественном бизнесе. А потому с этой версией сталкиваться приходится очень редко.

Компонентная база 1С
Компонентная база 1С очень обширна, в ней заложено огромное число возможностей, при этом 1С постоянно дробит и добавляет функции. Т.е. в случае, когда разработчикам 1С требуется создать что-то новое, они практически всегда создают новый вид объекта. Например, когда потребовались web-сервисы, разработчики не стали делать какой-то плагин, а просто ввели понятие: web-сервис. Аналогично для многих бизнес-процессов в компании 1С чаще всего создают новый компонент даже в тех случаях, когда можно было бы просто доработать существующий.

Что можно сказать о компонентах платформы 1С:

  • Часть компонентов работают давно, некоторые с момента создания программного продукта. Они стабильны и надежны.
  • Часть компонентов добавлены недавно, некоторые добавляются прямо сейчас. Они в большинстве своем очень слабо протестированы, а потому работать с ними нужно с предельной осторожностью.
При выборе компонента, с которым вы будете работать, всегда нужно обращать внимание на то, когда он был добавлен. У профессиональных программистов 1С есть такое правило: при добавлении разработчиками новой функции по возможности обходить ее стороной, пока не пройдет достаточное количество времени. Т.е. они выжидают, пока компонент не пройдет тестирование на практике, будут выявлены и исправлены основные «баги», и только потом начинают с ним активно работать.

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

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

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

По этому признаку можно выбрать:

  1. Нативный 1С-клиент. Это традиционный программный интерфейс, когда к 1С идет обращение из 1С.
  2. Работу через браузер.
  3. Работу через мобильное приложение.
Каждый из вариантов имеет некоторые ограничения, подробнее о них вы можете почитать на официальном сайте 1С.
Нативный клиент
Нативный клиент также делится на серию подклиентов, что вносит в вопрос выбора программного обеспечения дополнительный хаос. Здесь самое главное – это выбрать «толстый» или «тонкий» вариант клиента. На первый взгляд, выбор здесь не критичный, особенно для программиста. На самом деле, при работе с конфигурацией через интерфейс могут возникать проблемы из-за ошибок выбора.

В чем разница между этими подклиентами?

«Толстому» требуется широкий (толстый) канал связи, «тонкому» хватает минимума. Подавляющее большинство моих заказчиков пользуются «толстым» клиентом, так как локальные или интернет-каналы сейчас у всех хорошие, проблем с их «шириной» не возникает. С другой стороны, «тонкий» клиент имеет определенные ограничения в работе, есть вещи, которые в нем сделать невозможно.

Web-клиент (работа через браузер)
Web-клиент – это работа с программой 1С через браузер. Т.е. вы используете определенную технологию, которая позволяет через Интернет, используя удобный для вас браузер, получить доступ к базе данных. При этом интерфейс полностью обрисовывается непосредственно в браузере.

Определенные ограничения такой вариант накладывает, об этом нужно постоянно помнить. С другой стороны, работа с Web-клиентом достаточно стабильна, неплохо отлажена, доведена до определенного логического завершения. А потому этим вариантом интерфейса пользуется довольно много людей. Работать с 1С в онлайне бывает очень удобно и даже необходимо.

Мобильная версия
Этот вариант клиента от 1С появился сравнительно недавно и пока что особым спросом не пользуется. Причины такого отношения:
  1. Клиент получился очень сложным. Для того, чтобы настроить эту программу, человек должен знать одновременно 1С и мобильные технологии, причем, достаточно глубоко на уровне кода. Понятно, что найти такого специалиста довольно сложно, что не способствует популярности программного решения.
  2. Технология еще очень «сырая» и плохо отлаженная. Я лично пробовал это решение применить для своих клиентов, общался с коллегами, которые также ознакомились с этой технологией, и на данный момент мое мнение и мнение коллег совпадает: проще и удобнее создать какое-то свое мобильное приложение, чем использовать вариант от 1С.
Мобильная версия должна сочетать в себе очень много всего, здесь требуется работа нескольких специалистов, которые будут работать вместе и помогать друг другу:
  • Настройка доступа к базе данных извне;
  • Решение вопросов безопасности;
  • Настройка сервера для работы с мобильными приложениями;
  • Настройка программных продуктов 1С;
  • Настройка web-приложений (по необходимости).
Все это необходимо для обеспечения корректной работы мобильного приложения от 1С. Понятно, что собрать такую команду специалистов сложно и дорого, а потому в малом и среднем бизнесе это решение популярностью не пользуется.
Платформа 1С: резюме
Платформа 1С – очень функциональна, в ней имеется огромный список самых разных возможностей. И это количество естественным образом переходит в сложность. В результате порог вхождения в работу с 1С для программиста очень высок. Клиенты слышат о разных возможностях 1С, просят программиста помочь в их реализации. А это значит, что специалист должен быть постоянно в курсе обновлений, понимать и знать самые разные вещи.

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

Но клиенты этого обычно не понимают, и начинают требовать от 1С-программиста внедрения самых разных возможностей.

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

Все это вместе приводит к проблеме позиционирования:

  • С одной стороны есть компания 1С, которая говорит клиентам, что 1С – это просто и удобно. Они нигде не пишут, что для обслуживания 1С потребуется специалист с особыми знаниями, что работать программистам с современной 1С – сложно.
  • С другой стороны – в реальности клиент сталкивается со всеми этими проблемами. И хорошо, если ему на помощь придет либо хорошо сработавшаяся команда, занимающаяся внедрением 1С, либо бизнес-консультант с моим уровнем знаний, который сумеет найти нужных специалистов и поставить им правильно задачи. В иных случаях пользователя ждет масса проблем в процессе внедрения.

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

На понятийном уровне я думаю, информации достаточно. А технические нюансы вы всегда можете найти на ресурсах 1С, которые я рекомендовал выше.

Конфигурации

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

Конфигурации бывают:

  1. Типовые – написанные компанией 1С. Они все присутствуют на сайте 1С.
  2. Нетиповые – написанные компаниями-партнерами.
На уровне пользователя эти два типа различаются следующим образом:
  1. Типовые конфигурации создает и сопровождает компания 1С. В большинстве случаев они большее качественные, в этих конфигурациях лучше организована работа с кодом, используются чаще всего оптимальные решения, оперативно исправляются ошибки. Конечно, все и постоянно слышат о «вечных багах» в типовых конфигурациях 1С, и они там действительно постоянно присутствуют, но все таки, стоит отдать должное специалистам компании. Критичные ошибки они исправляют действительно оперативно.
  2. Нетиповые конфигурации пишут компании-партнеры 1С, и здесь достаточно сложно сказать что-то определенное. Такие конфигурации бывают очень разными. Чаще всего их пишут по случаю: отраслевые (для какой-то определенной отрасли) или написанные для определенного случая (конкретной компании). И здесь необходимо понимать, что компании-партнеры 1С в большинстве своем имеют достаточно высокую текучку кадров. А потому и конфигурации в них пишутся довольно не организовано. Начинает писать один программист, продолжает – другой, завершает – третий. При это каждый из них вносит туда что-то свое, свое понимание, решения, идеи. А наработки предшественника применяет так, как удобно, а не как это было задумано.
Может быть, вы помните забавный мультфильм «Трое из Простоквашино»? Там мальчик дядя Федор писал письмо родителям, но не дописал, отвлекся, и за него дописывали по очереди друзья: кот и пес. И каждый из них рассказывал о своих проблемах. В результате родители мальчика с удивлением узнали, что у него «то лапы ломит, то хвост отваливается». Вот по такому принципу очень часто пишут нетиповые конфигурации.
Отсутствие преемственности при написании нетиповых конфигураций, а часто и достаточно подробной документации, приводят к тому, что по всем вопросам внедрения и доработок придется обращаться в компанию, которая разработала эту конфигурацию.

Нетиповые конфигурации также бывают двух видов:
  1. Написанные на основе типовых. Эти конфигурации создаются путем добавления функционала к какой-то типовой. Например, существует такой продукт, как 1С: Управление торговлей и CRM. Здесь совместили типовую конфигурацию Управление торговли и систему CRM. Интересно, что создатели конфигурации компания Рарус, называют именно Управление торговли подсистемой, хотя на самом деле – это была та основа, на которой писалась вся конфигурация.
       Плюсы таких конфигураций – они более функциональны в сравнении с типовыми, в них добавлены часто очень нужные возможности.
       Минусы – разработчики этих конфигураций часто не успевают создавать своевременно свои обновления. Таким образом, очень может быть, что компания 1С уже выложила свои варианты обновлений, а пользователю нетипового решения придется ждать какое-то время, пока разработчик создаст аналогичное обновление для конкретного решения. Кроме того, подобные доработки также бывают достаточно «сырыми», в них может быть много ошибок.
       
  2. Конфигурации, написанные с нуля. При их создании типовые конфигурации не используются вообще, решения пишутся для определенных задач.
       Плюсы : конфигурация написала точно под нужны заказчика, здесь есть все необходимое и почти ничего лишнего.
       Минусы : обычно при написании подобных решений стандарты кода не соблюдаются, дорабатывать подобные программные продукты очень сложно, чаще всего, это может сделать достаточно быстро только автор.
Если я приходил к клиентам и видел, что там стоит нетиповая конфигурация, написанная с нуля, я стараюсь либо не трогать ее вообще, либо полностью меняю на удобное и универсальное решение. Достаточно часто подобные решения на самом деле не требуются, особенно в малом и среднем бизнесе. При этом типовые продукты проще в дальнейшем обслуживании, и, как следствие, дешевле, что для бизнеса всегда важно.

Резюме

Важно понимать, что предприниматели обычно ищут именно конфигурацию. Например, для автоматизации работы бухгалтерии им требуется 1С.Бухгалтерия, а для организации работы с клиентами – 1С. Управление торговлей. Именно эти продукты им понятны, а потому интересны.

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

Напомню, что специалисты 1С также бывают разные. Одни занимаются разработкой платформы и типовых конфигураций (сотрудники компании 1С), другие являются ее партнерами и занимаются внедрением и доработками, третьи – частным образом помогают решать те или иные задачи, связанные с внедрением 1С. Добавить метки