Импорт документов из 1С и изменение даты документа в 1С

В настройках синхронизации с 1С при добавлении объекта синхронизации типа "Документ" автоматически добавляются ключевые поля для связки документа в ТС с документом в 1С:
- ДатаДок
- НомерДок
- Объект1С (название объекта 1С)

В 1С бывает возникает ситуация, когда дата документа корректируется и изменяется, например, с даты 01.08.11 на 05.08.11. В таком случае при следующем импорте документа в Террасофт из 1С фильтрация по дате 05.08.11, номеру документа и объекту 1С выдаст пустой результат, и создастся новый документ в Террасофте. Но это не правильно, потому что на самом деле этот документ уже есть в Террасофте. Допустим, номер документа является уникальным в 1С в диапазоне 1 года. Каким образом нужно настроить импорт документов из 1С так, чтобы находились документы не по полной дате, а по году, то есть накладывался фильтр по 2011 году? Учитывается ли в утилите синхронизации такая особенность? и как это сделать?

Нравится

3 комментария

В базовой версии интеграции нет фильтрации исключительно по году.

В случае, если номер документа является уникальным - необходимо установить данное поле [Номер] как Ключевое (а у даты - снять данную галочку).
Нумерацию же документов можно проводить с учетом года (указывая в номере документа год). Или проводить фильтрацию: "дата создания документа больше чем 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:

Показать все комментарии