Импорт документов из 1С и изменение даты документа в 1С
В настройках синхронизации с 1С при добавлении объекта синхронизации типа "Документ" автоматически добавляются ключевые поля для связки документа в ТС с документом в 1С:
- ДатаДок
- НомерДок
- Объект1С (название объекта 1С)
В 1С бывает возникает ситуация, когда дата документа корректируется и изменяется, например, с даты 01.08.11 на 05.08.11. В таком случае при следующем импорте документа в Террасофт из 1С фильтрация по дате 05.08.11, номеру документа и объекту 1С выдаст пустой результат, и создастся новый документ в Террасофте. Но это не правильно, потому что на самом деле этот документ уже есть в Террасофте. Допустим, номер документа является уникальным в 1С в диапазоне 1 года. Каким образом нужно настроить импорт документов из 1С так, чтобы находились документы не по полной дате, а по году, то есть накладывался фильтр по 2011 году? Учитывается ли в утилите синхронизации такая особенность? и как это сделать?
Нравится
В базовой версии интеграции нет фильтрации исключительно по году.
В случае, если номер документа является уникальным - необходимо установить данное поле [Номер] как Ключевое (а у даты - снять данную галочку).
Нумерацию же документов можно проводить с учетом года (указывая в номере документа год). Или проводить фильтрацию: "дата создания документа больше чем 31.12.2010"(в этом случае номер в рамках года будет уникальным).
Обычно, в базовых конфигурациях 1С, нумерация документов идет в рамках года и при внедрении новой системы не всегда можно убедить клиента изменить нумерацию документов.(тем более существующих)
Дело в том, что каждый элемент в 1С имеет тоже уникальный идентификатор. Вот к нему можно и попытаться привязаться, но уже из скрипта
Вот пример получения уникального кода в 1С
ГУИДССЫЛКИ = СсылкаНаОбъект.УникальныйИдентификатор(); // или НоменклатураСсылка = Справочники.Номенклатура.НайтиПоКоду("00013"); Если НЕ НоменклатураСсылка.Пустая() Тогда Сообщить("GUID = " + НоменклатураСсылка.УникальныйИдентификатор()); КонецЕсли;
Я эту проблему у себя решал тем, что создавал фильтр типа like и накладывал это фильтр там, где шла фильтрация по полю Date1C (ДатаДок):
function AddDate1CYearFilter(SelectQuery) { for (var i = 0; i < SelectQuery.Count; i++){ var Select = SelectQuery.Items(i); var Filters = Select.Filters; AddLikeFieldFilter(Select, 'Date1CYear', 'Date1C', ltEqual); } } function ApplyDate1CYearFilter(Dataset, DocDate) { var FilterName = 'Date1CYear'; var SelectQuery = Dataset.SelectQuery; var DateObj = new Date(DocDate); var FilterPattern = '[0-3][0-9].[0-1][0-9].'+DateObj.getYear(); var FilterCodes = new Array(FilterName); EnableSelectQueryFilters(SelectQuery, true, FilterCodes); SetParameterValue(SelectQuery.Parameters, FilterName, FilterPattern); }
Вызов этих функций в разных местах:
AddDate1CYearFilter(Dataset.SelectQuery); ApplyDate1CYearFilter(Dataset, DocDate);
Может и есть какое-то лучшее решение, но пока сделал так :smile: