Приемы при решении задач. Сертификация на Специалиста по Платформе 1С
В данном посте я буду описывать приемы которые узнаю в процессе решения задач на Специалиста по Платформе 1С.
Оперативный учет
При проектировании регистров накоплений лучше придерживаться схемы:
- Выписываем все ресурсы регистров накоплений
- Определяем для каждого ресурса в каких измерениях он должен измеряться
- Объединяем в регистры в зависисмости от комбинаций измерений.
Когда описывается процедура ПроведениеДокумента лучше код разделять на блоки по логическим задачам. Каждый блок можно выделять в отдельную процедуру или функцию. Например, можно разделить на три части «Подготовка», «Формирование движений», «Контроль остатков». Данные части вполне могут выступать независимо. Разделение на блоки упрощает кодирование и читаемость кода.
Движения в регистре по партиям
Стандартная логика нам говорит — сформируй несколько запросов. Первый — таблица с номенклатурой и количеством к списанию. Второй — таблица с остатками по каждой выбранной в итерации цикла номенклатуре.
Гораздо более удобно сформировать один запрос одновременно к таблице ТЧ и таблице остатков. И сделать выборку с обходом по группировкам. Группировку сделать по номенклатуре и количеству из табличной части. В итоге, у нас на выходе будет один запрос и два цикла (один вложен в другой). В рамках первого мы получаем обход по записям групп. В рамках второго — обход по вложенным записям. Нет лишних запросов к БД, код компактен, читаем и логичен.
Если есть Учетная политика FIFO/LIFO — реализовать сортировку в тексте запроса лучше с помощью замены в тексте запроса строки на нужную через СтрЗаменить().
Контроль остатков
Важно понимать, что формирование движений по регистрам реализовано в транзакции. Если транзакция будет прервана (например, когда вы проставите Отказ=Истина) — все изменения произведенные в обработке проведения будут отменены.
Обычно первое, что приходит на ум: получить номенклатуру, получить ее остатки на складе, сравнить количество подлежащее списанию с остатками на складе и если мы хотим списать больше чем есть — сформировать ошибку, иначе — записать данные в регистр. В данном случае у нас будет много операций сравнения. Запись в регистры и контроль остатков будут реализованы в одном блоке.
Альтернативный вариант — разделить собой запись в регистры и проверку остатков. В первую очередь — сформировать движения, записать их в регистр. Вторым этапом — построить запрос к остаткам и если остатки отрицательные — вывести ошибку и прописать «Отказ = Истина; Возврат;». Сформированные движения по регистру не будут записаны при отмене проведения. Код более читабельный и простой. Проверяем остатки одним запросом без лишних циклов сравнения.