Работа с данными (выборка, создание, удаление)

Содержание

Рассмотрим на какие классы проецируется информация, полученная от 1С, и как их использовать в работе.

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

Иерархия классов метаданных

Иерархия классов метаданных

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

Ref – базовый класс для всех ссылочный объектов: справочников и документов.

Table – родитель для всех необъектных сущностей не имеющих уникального идентификатора – ссылки. Это например, “запись регистра сведений” или “строка во внешней таблице”.

Catalog и Document выступают родителями для ваших выбранных справочников и документов непосредственно при генерации шаблона мобильного приложения. Например, если выбрать справочник “Номенклатура” то будет сгенерирован класс:

1
public class CatalogNomenklatura extends Catalog {}
public class CatalogNomenklatura extends Catalog {}

На схеме видно, что эти объекты реализуют интерфейс IPresentation. Для справочников представление по умолчанию будет сгенерировано так же, как оно указано в конфигурации 1С (ОбъектМетаданных.Основное представление)  в виде кода или наименования. Для документов строка типа: «Документ.ЗаказПокупателя: 00001 01.01.2013 00:00:00».

Изменить представление достаточно просто – переопределите метод getPresentation, например для справочника:

1
2
3
4
@Override
public String getPresentation() {
    return getCode() + " " + getDescription();
}
@Override
public String getPresentation() {
   	return getCode() + " " + getDescription();
}

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

ConstTable – родитель вашего класса констант Constants.java (если вы не меняли имя при генерации шаблона в 1С).

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

TableInfReg, TableInfRegPeriodic – базовые классы регистров сведений. Периодический отличается от «обычного» наличием колонки «период», которая включается в ключ записи.

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

1
2
3
4
5
6
7
@Override
public String createRecordKey() {
    StringBuilder sb = new StringBuilder();
    sb.append(super.createRecordKey());
    sb.append(valyuta);
    return sb.toString();
}
@Override
public String createRecordKey() {
   	StringBuilder sb = new StringBuilder();
   	sb.append(super.createRecordKey());
   	sb.append(valyuta);
   	return sb.toString();
}

Поле «Валюта» включено в ключ. Это значит, что в таблице не может присутствовать 2 записи с одинаковой валютой за один и тот же интервал.

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

TablePart – базовый класс для табличных частей справочников и документов.

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

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

1
2
3
4
5
/**
 * Владелец табличной части
 */
@DatabaseField(columnName=TablePart.FIELD_NAME_REF_ID, canBeNull = false, foreign = true, foreignAutoRefresh = false,   columnDefinition = "VARCHAR REFERENCES " +DocumentVnutrenniiZakaz.TABLE_NAME+"("+Ref.FIELD_NAME_REF+") ON DELETE CASCADE")
protected DocumentVnutrenniiZakaz owner;
/**
 * Владелец табличной части
 */
@DatabaseField(columnName=TablePart.FIELD_NAME_REF_ID, canBeNull = false, foreign = true, foreignAutoRefresh = false,	columnDefinition = "VARCHAR REFERENCES " +DocumentVnutrenniiZakaz.TABLE_NAME+"("+Ref.FIELD_NAME_REF+") ON DELETE CASCADE")
protected DocumentVnutrenniiZakaz owner;

Если вы хотите запись в табличную часть производить независимо, удалите ключ columnDefinition из аннотации DatabaseField поля owner. Не забудьте пересоздать таблицы sql после этого (например пере-установите программу).

TableEx – базовый класс для внешних таблиц. Для каждой «ТаблицыЗначений», созданной  в дереве метаданных мобильного приложения в 1С, будет сгенерирован отдельный класс.

Иерархия классов DAO

Вторая группа – это объекты доступа к данным т.н DAO-менеджеры. Для каждого «класса-сущности» при генерации создается один менеджер доступа. В терминах 1С, менеджеру DAO по смыслу больше подходит «модуль объекта» (если 8.1) или «модуль менеджера» (для 8.2).

engine_dao

DBOpenHelper – базовый класс для вашего помощника DBHelper.java по работе с базой данных. Инициализация базы данных, события создания, обновления и открытия соединений. Также содержит методы очистки базы данной(полной или по таблицам).

1
2
3
4
5
6
7
8
9
10
11
12
//удалить все таблицы из базы данных
getHelper().dropTables(getMetadataHelper());
 
//очистить все таблицы, структура таблиц остается неизменной
getHelper().clearTables(getMetadataHelper());
 
//Очистить таблицу базы данных (удаляются все записи, структура колонок остается неизменной)
getHelper().clearTable(CatalogKontragenti.class);
 
//Удалить из справочника «Контрагенты» все группы
CatalogKontragentiDao dao = new CatalogKontragentiDao(getConnectionSource());
DBOpenHelper.clearTable(dao, CatalogKontragenti.FIELD_NAME_FOLDER, "=", true);
//удалить все таблицы из базы данных
getHelper().dropTables(getMetadataHelper());

//очистить все таблицы, структура таблиц остается неизменной
getHelper().clearTables(getMetadataHelper());

//Очистить таблицу базы данных (удаляются все записи, структура колонок остается неизменной)
getHelper().clearTable(CatalogKontragenti.class);

//Удалить из справочника «Контрагенты» все группы
CatalogKontragentiDao dao = new CatalogKontragentiDao(getConnectionSource());
DBOpenHelper.clearTable(dao, CatalogKontragenti.FIELD_NAME_FOLDER, "=", true);

RowDao – содержит методы доступные для любой таблицы данных: выборка элементов списком или курсором, очистка данных

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//Что-то сделать с элементами справочника «Контрагенты»
RowDao<? extends Row> dao = new CatalogKontragentiDao(getConnectionSource());
doSomethingData(dao);
 
//Что-то сделать с документами
DocumentSobitieDao docDao = getHelper().getDao(DocumentSobitie.class);
doSomethingData(docDao);
 
private void doSomethingData(RowDao<? extends Row> dao) throws SQLException{
 
    //Выбрать все элементы
    List<? extends Row> lst = dao.select();
 
    //или выбрать только изменённые
    List<? extends Row> lst2 = dao.selectChanged();
 
    for(Row row:lst){
            Log.i(TAG, "Modified = " +row.isModified());
    }
}
//Что-то сделать с элементами справочника «Контрагенты»
RowDao<? extends Row> dao = new CatalogKontragentiDao(getConnectionSource());
doSomethingData(dao);

//Что-то сделать с документами
DocumentSobitieDao docDao = getHelper().getDao(DocumentSobitie.class);
doSomethingData(docDao);

private void doSomethingData(RowDao<? extends Row> dao) throws SQLException{

   	//Выбрать все элементы
   	List<? extends Row> lst = dao.select();

   	//или выбрать только изменённые
   	List<? extends Row> lst2 = dao.selectChanged();

   	for(Row row:lst){
          	Log.i(TAG, "Modified = " +row.isModified());
   	}
}

RefDao – предоставляет общие методы для работы с объектами данными (основа для справочников и документов).

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

1
2
3
4
5
6
7
8
/*
 * Варианты создания менеджера. Все три менеджера ссылаются на один
 * и тот-же класс CatalogKontragentiDao.class
 */
DBHelper helper = (DBHelper) getHelper();
CatalogDao<CatalogKontragenti> dao1 = helper.getDao(CatalogKontragenti.class);
CatalogDao<CatalogKontragenti> dao2 = new CatalogKontragentiDao(getConnectionSource());
CatalogKontragentiDao dao3 = helper.getDao(CatalogKontragenti.class);
/*
 * Варианты создания менеджера. Все три менеджера ссылаются на один
 * и тот-же класс CatalogKontragentiDao.class
 */
DBHelper helper = (DBHelper) getHelper();
CatalogDao<CatalogKontragenti> dao1 = helper.getDao(CatalogKontragenti.class);
CatalogDao<CatalogKontragenti> dao2 = new CatalogKontragentiDao(getConnectionSource());
CatalogKontragentiDao dao3 = helper.getDao(CatalogKontragenti.class);

Поиск, выборка

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
//1. Найти элемент по коду
Catalog item = daoCatalogKachestvo.findByCode("000000002");
 
//2. Найти элемент по наименованию
Catalog item = daoCatalogOrganizacii.findByDescription("Cтройснаб");
 
//3. Найти по частичному совпадению наименования
Catalog item = daoCatalogOrganizacii.findByDescription("Комплекс", true, null, null);
 
//4.Найти по коду в пределах каталога
Catalog folder = daoCatalogNomenklatura.findByCode("00000000053");
Catalog item = daoCatalogNomenklatura.findByCode("00000000064", (CatalogNomenklatura) folder, null);
 
//5. Найти по значению реквизита
Catalog item = daoCatalogNomenklatura.findByAttribute(CatalogNomenklatura.FIELD_NAME_ARTIKUL, "Арт-7777");
 
//6. Выбрать все элементы справочника
List<CatalogFizicheskieLica> list = daoCatalogFizicheskieLica.select();
 
//7. Выбрать из группы
CatalogFizicheskieLica folser = daoCatalogFizicheskieLica.findByCode("000000046");
List<CatalogFizicheskieLica> list = daoCatalogFizicheskieLica.select(folser);
 
//8. Выбрать из группы с дополнительным отбором (где наименование  = "Королев Сергей Васильевич")
CatalogFizicheskieLica folder = daoCatalogFizicheskieLica.findByCode("000000048");
 
HashMap<String, Object> filter = new HashMap<String, Object>();
filter.put(Catalog.FIELD_NAME_DESCRIPTION, "Королев Сергей Васильевич");
 
List<CatalogFizicheskieLica> list = daoCatalogFizicheskieLica.select(folder,filter);
 
//9. Выбрать иерархию (только группы)  
GenericTree<CatalogFizicheskieLica> tree = daoCatalogFizicheskieLica.selectHierarchy();
//Дерево в линейный список (корень не включен)
List<CatalogFizicheskieLica> lst = daoCatalogFizicheskieLica.hierarchyToList(tree, false);
 
//10. Выбрать иерархически элементы справочника по родителю  (с пользовательской сортировкой)
CatalogNomenklatura folder = daoCatalogNomenklatura.findByCode("00000000012");
 
GenericTree<CatalogNomenklatura> tree = daoCatalogNomenklatura.selectHierarchically(folder,Catalog.FIELD_NAME_DESCRIPTION+" DESC");
 
//11. Найти по значению ссылки
CatalogNomenklatura item = daoCatalogNomenklatura.findByRef("bd72d910-55bc-11d9-848a-00112f43529a");
//Выбрать все по владельцу из подчиненного справочника
List<CatalogHarakteristikiNomenklaturi> lst = daoCatalogHarakteristikiNomenklaturi.select(null, item);
 
//12. получить новый номер
int newCode = daoCatalogEdiniciIzmereniya.getNextCode();
newCode = daoCatalogEdiniciIzmereniya.getNextCode("ЦУ");
//1. Найти элемент по коду
Catalog item = daoCatalogKachestvo.findByCode("000000002");

//2. Найти элемент по наименованию
Catalog item = daoCatalogOrganizacii.findByDescription("Cтройснаб");

//3. Найти по частичному совпадению наименования
Catalog item = daoCatalogOrganizacii.findByDescription("Комплекс", true, null, null);

//4.Найти по коду в пределах каталога
Catalog folder = daoCatalogNomenklatura.findByCode("00000000053");
Catalog item = daoCatalogNomenklatura.findByCode("00000000064", (CatalogNomenklatura) folder, null);

//5. Найти по значению реквизита
Catalog item = daoCatalogNomenklatura.findByAttribute(CatalogNomenklatura.FIELD_NAME_ARTIKUL, "Арт-7777");

//6. Выбрать все элементы справочника
List<CatalogFizicheskieLica> list = daoCatalogFizicheskieLica.select();

//7. Выбрать из группы
CatalogFizicheskieLica folser = daoCatalogFizicheskieLica.findByCode("000000046");
List<CatalogFizicheskieLica> list = daoCatalogFizicheskieLica.select(folser);

//8. Выбрать из группы с дополнительным отбором (где наименование  = "Королев Сергей Васильевич")
CatalogFizicheskieLica folder = daoCatalogFizicheskieLica.findByCode("000000048");

HashMap<String, Object> filter = new HashMap<String, Object>();
filter.put(Catalog.FIELD_NAME_DESCRIPTION, "Королев Сергей Васильевич");

List<CatalogFizicheskieLica> list = daoCatalogFizicheskieLica.select(folder,filter);

//9. Выбрать иерархию (только группы)  
GenericTree<CatalogFizicheskieLica> tree = daoCatalogFizicheskieLica.selectHierarchy();
//Дерево в линейный список (корень не включен)
List<CatalogFizicheskieLica> lst = daoCatalogFizicheskieLica.hierarchyToList(tree, false);

//10. Выбрать иерархически элементы справочника по родителю  (с пользовательской сортировкой)
CatalogNomenklatura folder = daoCatalogNomenklatura.findByCode("00000000012");

GenericTree<CatalogNomenklatura> tree = daoCatalogNomenklatura.selectHierarchically(folder,Catalog.FIELD_NAME_DESCRIPTION+" DESC");

//11. Найти по значению ссылки
CatalogNomenklatura item = daoCatalogNomenklatura.findByRef("bd72d910-55bc-11d9-848a-00112f43529a");
//Выбрать все по владельцу из подчиненного справочника
List<CatalogHarakteristikiNomenklaturi> lst = daoCatalogHarakteristikiNomenklaturi.select(null, item);

//12. получить новый номер
int newCode = daoCatalogEdiniciIzmereniya.getNextCode();
newCode = daoCatalogEdiniciIzmereniya.getNextCode("ЦУ");

Создание элементов и групп

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
/*
 * 13.Пример добавления двух элементов в справочник «Качество», заполняются
 * только код и наименование. Считается, что в конфигурации 1С длина
 * номера для этого справочника = 9
 */
int lenCode = 9;
CatalogKachestvoDao daoCatalogKachestvo = dbHelper.getDao(CatalogKachestvo.class);
 
int newCode = daoCatalogKachestvo.getNextCode();
CatalogKachestvo item = daoCatalogKachestvo.newItem();
 
String strCode = daoCatalogKachestvo.formatNumber(newCode, lenCode);
item.setCode(strCode);
item.setDescription("Б/У");
 
daoCatalogKachestvo.create(item);
 
newCode++;
item = daoCatalogKachestvo.newItem();
strCode = daoCatalogKachestvo.formatNumber(newCode, lenCode);
item.setCode(strCode);
item.setDescription("Некондиция");
 
daoCatalogKachestvo.create(item);
/*
 * 13.Пример добавления двух элементов в справочник «Качество», заполняются
 * только код и наименование. Считается, что в конфигурации 1С длина
 * номера для этого справочника = 9
 */
int lenCode = 9;
CatalogKachestvoDao daoCatalogKachestvo = dbHelper.getDao(CatalogKachestvo.class);

int newCode = daoCatalogKachestvo.getNextCode();
CatalogKachestvo item = daoCatalogKachestvo.newItem();

String strCode = daoCatalogKachestvo.formatNumber(newCode, lenCode);
item.setCode(strCode);
item.setDescription("Б/У");

daoCatalogKachestvo.create(item);

newCode++;
item = daoCatalogKachestvo.newItem();
strCode = daoCatalogKachestvo.formatNumber(newCode, lenCode);
item.setCode(strCode);
item.setDescription("Некондиция");

daoCatalogKachestvo.create(item);

Изменение, удаление

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
//14. Найти и изменить элемент
CatalogCenovieGruppiDao daoCatalogCenovieGruppi = dbHelper.getDao(CatalogCenovieGruppi.class);
 
CatalogCenovieGruppi ref = Dao.daoCatalogCenovieGruppi.findByDescription(desc);
if(!CatalogCenovieGruppi.isEmpty(ref)){
 
    ref.setDescription("изменен: " + desc);
    ref.setParent(null);
    daoCatalogCenovieGruppi.update(ref);
}
 
//15. Пометить элемент справочника «Контрагенты» на удаление, все
// договоры по нему так же пометить на удаление
if (!CatalogKontragenti.isEmpty(ref)) {
 
    ref.setDescription("на удаление: " + desc);
    ref.setDeletionMark(true);
    ref.setModified(true);
 
    //Здесь Dao.daoCatalogKontragenti = CatalogKontragentiDao
    Dao.daoCatalogKontragenti.update(ref);
 
    //Здесь Dao.daoCatalogDogovoriKontragentov = daoCatalogDogovoriKontragentovDao
    List<CatalogDogovoriKontragentov> lst = Dao.daoCatalogDogovoriKontragentov
                                        .select(null, ref);
    for (CatalogDogovoriKontragentov dogovor : lst) {
            dogovor.setDeletionMark(true);
            dogovor.setModified(true);
            dogovor.setDescription("на удаление: "
                                                + dogovor.getDescription());
            Dao.daoCatalogDogovoriKontragentov.update(dogovor);
    }
}
 
//16. Найти и удалить элемент справочника
CatalogValyuti ref = Dao.daoCatalogValyuti.findByCode(code);
if(!CatalogValyuti.isEmpty(ref)){
    Dao.daoCatalogValyuti.delete(ref);
}
//14. Найти и изменить элемент
CatalogCenovieGruppiDao daoCatalogCenovieGruppi = dbHelper.getDao(CatalogCenovieGruppi.class);

CatalogCenovieGruppi ref = Dao.daoCatalogCenovieGruppi.findByDescription(desc);
if(!CatalogCenovieGruppi.isEmpty(ref)){

   	ref.setDescription("изменен: " + desc);
   	ref.setParent(null);
   	daoCatalogCenovieGruppi.update(ref);
}

//15. Пометить элемент справочника «Контрагенты» на удаление, все
// договоры по нему так же пометить на удаление
if (!CatalogKontragenti.isEmpty(ref)) {

   	ref.setDescription("на удаление: " + desc);
   	ref.setDeletionMark(true);
   	ref.setModified(true);

   	//Здесь Dao.daoCatalogKontragenti = CatalogKontragentiDao
   	Dao.daoCatalogKontragenti.update(ref);

   	//Здесь Dao.daoCatalogDogovoriKontragentov = daoCatalogDogovoriKontragentovDao
   	List<CatalogDogovoriKontragentov> lst = Dao.daoCatalogDogovoriKontragentov
                                     	.select(null, ref);
   	for (CatalogDogovoriKontragentov dogovor : lst) {
          	dogovor.setDeletionMark(true);
          	dogovor.setModified(true);
          	dogovor.setDescription("на удаление: "
                                            	+ dogovor.getDescription());
          	Dao.daoCatalogDogovoriKontragentov.update(dogovor);
   	}
}

//16. Найти и удалить элемент справочника
CatalogValyuti ref = Dao.daoCatalogValyuti.findByCode(code);
if(!CatalogValyuti.isEmpty(ref)){
   	Dao.daoCatalogValyuti.delete(ref);
}

Прочее

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
//17. Форматировать строковое представление номера
String strCode = daoCatalogEdiniciIzmereniya.formatNumber(null, 5, 6);
assertEquals(strCode, "000005");
 
strCode = daoCatalogEdiniciIzmereniya.formatNumber("ПР", 5, 6);
assertEquals(strCode, "ПР0005");
 
//18. Выбрать измененные (в т.ч и новые элементы)
List<CatalogKachestvo> lst = daoCatalogKachestvo.selectChanged();
 
//19. Выбрать измененные (только добавленные элементы, т.е еще не переданные на сервер)
List<CatalogNomenklatura> lst = daoCatalogNomenklatura.selectChanged(true);
 
//20. Установить флаг модифицированности на всех
daoCatalogFizicheskieLica.setModified(true);
 
//21. Установить признак модифицированности на группу «Женская обувь»
HashMap<String, Object> filter = new HashMap<String, Object>();
filter.put(CatalogFizicheskieLica.FIELD_NAME_FOLDER, true);
filter.put(CatalogFizicheskieLica.FIELD_NAME_DESCRIPTION, "Женская обувь");
daoCatalogNomenklatura.setModified(true,filter);
//17. Форматировать строковое представление номера
String strCode = daoCatalogEdiniciIzmereniya.formatNumber(null, 5, 6);
assertEquals(strCode, "000005");

strCode = daoCatalogEdiniciIzmereniya.formatNumber("ПР", 5, 6);
assertEquals(strCode, "ПР0005");

//18. Выбрать измененные (в т.ч и новые элементы)
List<CatalogKachestvo> lst = daoCatalogKachestvo.selectChanged();

//19. Выбрать измененные (только добавленные элементы, т.е еще не переданные на сервер)
List<CatalogNomenklatura> lst = daoCatalogNomenklatura.selectChanged(true);

//20. Установить флаг модифицированности на всех
daoCatalogFizicheskieLica.setModified(true);

//21. Установить признак модифицированности на группу «Женская обувь»
HashMap<String, Object> filter = new HashMap<String, Object>();
filter.put(CatalogFizicheskieLica.FIELD_NAME_FOLDER, true);
filter.put(CatalogFizicheskieLica.FIELD_NAME_DESCRIPTION, "Женская обувь");
daoCatalogNomenklatura.setModified(true,filter);

DocumentDao – базовый менеджер для всех документов.

Поиск, выборка

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
//Найти по номеру
DocumentAvansoviiOtchet doc = daoDocumentAvansoviiOtchet.findByNumber("ССН00000001");
assertEquals(doc.getNumber(), "ССН00000001");
 
//Найти по номеру в интервале дат
Date dtBegin = DateHelper.date(2007, Calendar.MARCH, 1);
Date dtEnd = DateHelper.date(2007, Calendar.MARCH, 30);
 
DocumentSobitie doc = daoDocumentSobitie.findByNumber("00000000047",dtBegin,dtEnd);
assertNotNull(doc);
assertEquals(doc.getNumber(), "00000000047");
 
//Найти по значению атрибута
DocumentVnutrenniiZakaz doc = daoDocumentVnutrenniiZakaz.findByAttribute(DocumentVnutrenniiZakaz.FIELD_NAME_VID_ZAKAZA, EnumVidiVnutrennegoZakaza.VPodrazdelenie);
assertNotNull(doc);
assertEquals(doc.vidZakaza, EnumVidiVnutrennegoZakaza.VPodrazdelenie);
 
//Выбрать все документы
List<DocumentAvansoviiOtchet> lst = daoDocumentAvansoviiOtchet.select();
 
//Выбрать все документы за день
Date dtBegin = DateHelper.date(2007, Calendar.MAY, 5);
Date dtEnd = DateHelper.endOfDay(dtBegin);                  
List<DocumentSobitie> lst = daoDocumentSobitie.select(dtBegin,dtEnd);
 
//Выбрать все за интервал с дополнительным отбором по реквизиту
Date dtBegin = DateHelper.date(2007, Calendar.FEBRUARY, 2);
Date dtEnd = DateHelper.endOfDay(dtBegin);
 
HashMap<String, Object> filter = new HashMap<String, Object>();
filter.put(DocumentVnutrenniiZakaz.FIELD_NAME_VID_ZAKAZA, EnumVidiVnutrennegoZakaza.NaSklad);
 
List<DocumentVnutrenniiZakaz> lst = daoDocumentVnutrenniiZakaz.select(dtBegin,dtEnd,filter);
//Найти по номеру
DocumentAvansoviiOtchet doc = daoDocumentAvansoviiOtchet.findByNumber("ССН00000001");
assertEquals(doc.getNumber(), "ССН00000001");

//Найти по номеру в интервале дат
Date dtBegin = DateHelper.date(2007, Calendar.MARCH, 1);
Date dtEnd = DateHelper.date(2007, Calendar.MARCH, 30);

DocumentSobitie doc = daoDocumentSobitie.findByNumber("00000000047",dtBegin,dtEnd);
assertNotNull(doc);
assertEquals(doc.getNumber(), "00000000047");

//Найти по значению атрибута
DocumentVnutrenniiZakaz doc = daoDocumentVnutrenniiZakaz.findByAttribute(DocumentVnutrenniiZakaz.FIELD_NAME_VID_ZAKAZA, EnumVidiVnutrennegoZakaza.VPodrazdelenie);
assertNotNull(doc);
assertEquals(doc.vidZakaza, EnumVidiVnutrennegoZakaza.VPodrazdelenie);

//Выбрать все документы
List<DocumentAvansoviiOtchet> lst = daoDocumentAvansoviiOtchet.select();

//Выбрать все документы за день
Date dtBegin = DateHelper.date(2007, Calendar.MAY, 5);
Date dtEnd = DateHelper.endOfDay(dtBegin);                 	
List<DocumentSobitie> lst = daoDocumentSobitie.select(dtBegin,dtEnd);

//Выбрать все за интервал с дополнительным отбором по реквизиту
Date dtBegin = DateHelper.date(2007, Calendar.FEBRUARY, 2);
Date dtEnd = DateHelper.endOfDay(dtBegin);

HashMap<String, Object> filter = new HashMap<String, Object>();
filter.put(DocumentVnutrenniiZakaz.FIELD_NAME_VID_ZAKAZA, EnumVidiVnutrennegoZakaza.NaSklad);

List<DocumentVnutrenniiZakaz> lst = daoDocumentVnutrenniiZakaz.select(dtBegin,dtEnd,filter);

Создание

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
/*
 * Простой пример создания 2-х документов, заполняются только дата и номер.
 */
int lenCode = 11;
int numerator = daoDocumentSobitie.getNextNumber();
 
// 1
String strNumber = daoDocumentSobitie.formatNumber(numerator++,lenCode);
DocumentSobitie doc = daoDocumentSobitie.newItem();
doc.setDate(new Date(System.currentTimeMillis()));
doc.setNumber(strNumber);
daoDocumentSobitie.create(doc);
 
// 2
strNumber = daoDocumentSobitie.formatNumber(numerator++, lenCode);
doc = daoDocumentSobitie.newItem();
doc.setDate(new Date(System.currentTimeMillis()));
doc.setNumber(strNumber);
daoDocumentSobitie.create(doc);
 
/*
 * Пример создания документа, добавление 2 строк в табличную часть.
 */
int lenCode = 11;
int numerator = daoDocumentVnutrenniiZakaz.getNextNumber("ТК");
Date now = new Date(System.currentTimeMillis());
 
String strNumber = daoDocumentVnutrenniiZakaz.formatNumber("ТК",numerator++, lenCode);
 
DocumentVnutrenniiZakaz doc = daoDocumentVnutrenniiZakaz.newItem();
doc.setDate(now);
doc.setNumber(strNumber);
 
doc.dataOtgruzki = DateHelper.addDays(now, 1);
doc.dokumentOsnovanie = (DocumentSobitie) Ref.emptyRef(DocumentSobitie.class);
doc.ispolnitel = daoCatalogFizicheskieLica.findByDescription("Волков А. И.");
doc.kommentarii = "здесь текст комметария";
doc.organizaciya = daoCatalogOrganizacii.findByCode("000000001");
doc.otvetstvennii = daoCatalogPolzovateli.findByDescription("Сидорова Надежда Петровна");
doc.vidZakaza = EnumVidiVnutrennegoZakaza.NaSklad;
 
//записать док. в базу данных
daoDocumentVnutrenniiZakaz.create(doc);
 
//табличная часть "Товары"
int lineNumber = daoDocVnZakazTPTovati.getNextLineNumer(doc);
 
//строка 1
DocumentVnutrenniiZakazTPTovari row = daoDocVnZakazTPTovati.newItem(doc, lineNumber++);
CatalogNomenklatura sku = daoCatalogNomenklatura.findByDescription("BOSCH");
row.nomenklatura = sku;
row.edinicaIzmereniya = sku.edinicaHraneniyaOstatkov; //нужна только ссылка 
row.edinicaIzmereniyaMest = (CatalogEdiniciIzmereniya) Ref.emptyRef(CatalogEdiniciIzmereniya.class);
row.harakteristikaNomenklaturi = (CatalogHarakteristikiNomenklaturi) Ref.emptyRef(CatalogHarakteristikiNomenklaturi.class);
row.kolichestvo = 10;
row.koefficient = 1;
//сохранить строку 1
daoDocVnZakazTPTovati.create(row);
 
row = daoDocVnZakazTPTovati.newItem(doc, lineNumber++);
sku = daoCatalogNomenklatura.findByDescription("Кофеварка JACOBS (Австрия)");
CatalogEdiniciIzmereniya ed = sku.edinicaHraneniyaOstatkov;
//прочитать значения ссылки т.к будем брать коэффициент от единицы «через точку»
daoCatalogEdiniciIzmereniya.refresh(ed);
 
row.nomenklatura = sku;
row.edinicaIzmereniya = ed;
row.kolichestvo = 99;
row.koefficient = ed.koefficient;  //Единица должна быть считана
 
//сохранить строку 2
daoDocVnZakazTPTovati.create(row);
/*
 * Простой пример создания 2-х документов, заполняются только дата и номер.
 */
int lenCode = 11;
int numerator = daoDocumentSobitie.getNextNumber();

// 1
String strNumber = daoDocumentSobitie.formatNumber(numerator++,lenCode);
DocumentSobitie doc = daoDocumentSobitie.newItem();
doc.setDate(new Date(System.currentTimeMillis()));
doc.setNumber(strNumber);
daoDocumentSobitie.create(doc);

// 2
strNumber = daoDocumentSobitie.formatNumber(numerator++, lenCode);
doc = daoDocumentSobitie.newItem();
doc.setDate(new Date(System.currentTimeMillis()));
doc.setNumber(strNumber);
daoDocumentSobitie.create(doc);

/*
 * Пример создания документа, добавление 2 строк в табличную часть.
 */
int lenCode = 11;
int numerator = daoDocumentVnutrenniiZakaz.getNextNumber("ТК");
Date now = new Date(System.currentTimeMillis());

String strNumber = daoDocumentVnutrenniiZakaz.formatNumber("ТК",numerator++, lenCode);

DocumentVnutrenniiZakaz doc = daoDocumentVnutrenniiZakaz.newItem();
doc.setDate(now);
doc.setNumber(strNumber);

doc.dataOtgruzki = DateHelper.addDays(now, 1);
doc.dokumentOsnovanie = (DocumentSobitie) Ref.emptyRef(DocumentSobitie.class);
doc.ispolnitel = daoCatalogFizicheskieLica.findByDescription("Волков А. И.");
doc.kommentarii = "здесь текст комметария";
doc.organizaciya = daoCatalogOrganizacii.findByCode("000000001");
doc.otvetstvennii = daoCatalogPolzovateli.findByDescription("Сидорова Надежда Петровна");
doc.vidZakaza = EnumVidiVnutrennegoZakaza.NaSklad;

//записать док. в базу данных
daoDocumentVnutrenniiZakaz.create(doc);

//табличная часть "Товары"
int lineNumber = daoDocVnZakazTPTovati.getNextLineNumer(doc);

//строка 1
DocumentVnutrenniiZakazTPTovari row = daoDocVnZakazTPTovati.newItem(doc, lineNumber++);
CatalogNomenklatura sku = daoCatalogNomenklatura.findByDescription("BOSCH");
row.nomenklatura = sku;
row.edinicaIzmereniya = sku.edinicaHraneniyaOstatkov; //нужна только ссылка 
row.edinicaIzmereniyaMest = (CatalogEdiniciIzmereniya) Ref.emptyRef(CatalogEdiniciIzmereniya.class);
row.harakteristikaNomenklaturi = (CatalogHarakteristikiNomenklaturi) Ref.emptyRef(CatalogHarakteristikiNomenklaturi.class);
row.kolichestvo = 10;
row.koefficient = 1;
//сохранить строку 1
daoDocVnZakazTPTovati.create(row);

row = daoDocVnZakazTPTovati.newItem(doc, lineNumber++);
sku = daoCatalogNomenklatura.findByDescription("Кофеварка JACOBS (Австрия)");
CatalogEdiniciIzmereniya ed = sku.edinicaHraneniyaOstatkov;
//прочитать значения ссылки т.к будем брать коэффициент от единицы «через точку»
daoCatalogEdiniciIzmereniya.refresh(ed);

row.nomenklatura = sku;
row.edinicaIzmereniya = ed;
row.kolichestvo = 99;
row.koefficient = ed.koefficient;  //Единица должна быть считана

//сохранить строку 2
daoDocVnZakazTPTovati.create(row);

Изменение, удаление

1
2
3
4
// Удаление документа (если включено каскадное удаление, табличная
// часть так же будет удалена)
DocumentVnutrenniiZakaz doc = daoDocumentVnutrenniiZakaz.findByNumber("ТК000000007");
daoDocumentVnutrenniiZakaz.delete(doc);
// Удаление документа (если включено каскадное удаление, табличная
// часть так же будет удалена)
DocumentVnutrenniiZakaz doc = daoDocumentVnutrenniiZakaz.findByNumber("ТК000000007");
daoDocumentVnutrenniiZakaz.delete(doc);

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

Табличные части 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
//Выборка и изменение строк табличной части
ForeignCollection<DocumentVnutrenniiZakazTPTovari> tpTovati = doc.tovari;
for(DocumentVnutrenniiZakazTPTovari row : tpTovati){
    row.kolichestvo = row.kolichestvo + 1;
    row.koefficient = 0;
    tpTovati.update(row);
}
 
//Очистка табличной части документа 
ForeignCollection<DocumentVnutrenniiZakazTPVozvratnayaTara> tpTara = doc.vozvratnayaTara;
if(tpTara.size()>0){
    tpTara.clear();
}
 
//Добавление строки в табличную часть
ForeignCollection<DocumentVnutrenniiZakazTPTovari> tpTovati = doc.tovari;
int lineNumber = tpTovati.size() + 1;
DocumentVnutrenniiZakazTPTovari row = newDocumentVnutrenniiZakazTPTovari(doc,lineNumber);
tpTovati.add(row);
 
….
private DocumentVnutrenniiZakazTPTovari newDocumentVnutrenniiZakazTPTovari(DocumentVnutrenniiZakaz owner, int lineNumber) throws SQLException {
 
    CatalogNomenklatura nomen = findCreateNomenclatura();
 
    DocumentVnutrenniiZakazTPTovari row = Dao.daoDocumentVnutrenniiZakazTPTovari.newItem(owner, lineNumber);
    row.nomenklatura = nomen;
    row.edinicaIzmereniya = nomen.edinicaHraneniyaOstatkov;
    row.edinicaIzmereniyaMest = nomen.edinicaIzmereniyaMest;
    row.harakteristikaNomenklaturi = (CatalogHarakteristikiNomenklaturi) Ref.emptyRef(CatalogHarakteristikiNomenklaturi.class);
    row.koefficient = roundMoney(rnd.nextDouble() *10,2);
    row.kolichestvo = roundMoney(rnd.nextDouble() *100,2);
    row.kolichestvoMest = (lineNumber%2==0)? 1:0;
 
    return row;
 
}
//Выборка и изменение строк табличной части
ForeignCollection<DocumentVnutrenniiZakazTPTovari> tpTovati = doc.tovari;
for(DocumentVnutrenniiZakazTPTovari row : tpTovati){
  	row.kolichestvo = row.kolichestvo + 1;
  	row.koefficient = 0;
  	tpTovati.update(row);
}

//Очистка табличной части документа 
ForeignCollection<DocumentVnutrenniiZakazTPVozvratnayaTara> tpTara = doc.vozvratnayaTara;
if(tpTara.size()>0){
   	tpTara.clear();
}

//Добавление строки в табличную часть
ForeignCollection<DocumentVnutrenniiZakazTPTovari> tpTovati = doc.tovari;
int lineNumber = tpTovati.size() + 1;
DocumentVnutrenniiZakazTPTovari row = newDocumentVnutrenniiZakazTPTovari(doc,lineNumber);
tpTovati.add(row);

….
private DocumentVnutrenniiZakazTPTovari newDocumentVnutrenniiZakazTPTovari(DocumentVnutrenniiZakaz owner, int lineNumber) throws SQLException {

   	CatalogNomenklatura nomen = findCreateNomenclatura();

   	DocumentVnutrenniiZakazTPTovari row = Dao.daoDocumentVnutrenniiZakazTPTovari.newItem(owner, lineNumber);
   	row.nomenklatura = nomen;
   	row.edinicaIzmereniya = nomen.edinicaHraneniyaOstatkov;
   	row.edinicaIzmereniyaMest = nomen.edinicaIzmereniyaMest;
   	row.harakteristikaNomenklaturi = (CatalogHarakteristikiNomenklaturi) Ref.emptyRef(CatalogHarakteristikiNomenklaturi.class);
   	row.koefficient = roundMoney(rnd.nextDouble() *10,2);
   	row.kolichestvo = roundMoney(rnd.nextDouble() *100,2);
   	row.kolichestvoMest = (lineNumber%2==0)? 1:0;

   	return row;

}

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

ConstDao – менеджер для работы с константами. Все константы считываются и сохраняются в базу данных одновременно.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//Инициализация менеджера выполняется аналогично 
//ConstDao<Constants> daoConst = dbHelper.getDao(Constants.class);
//ConstantsDao daoConst = new ConstantsDao(getConnectionSource());
 
//Прочитать весь набор констант
Constants constans = daoConst.read();
 
//Установить значение константы
constans.dlinaKodaVesovogoTovara = 66;
 
//Сохранить значение константы типа ValueStorage во внешний файл
if(constans.fbaHranilische!=null){
    File file = new File(Dao.app.getAppSettings().getCacheDir(),"tmpImg.jpg");
    boolean complete = constans.fbaHranilische.writeToFile(file);
}
 
//Сохранить изменения (записать набор констант)
Dao.daoConst.save();
//Инициализация менеджера выполняется аналогично 
//ConstDao<Constants> daoConst = dbHelper.getDao(Constants.class);
//ConstantsDao daoConst = new ConstantsDao(getConnectionSource());

//Прочитать весь набор констант
Constants constans = daoConst.read();

//Установить значение константы
constans.dlinaKodaVesovogoTovara = 66;

//Сохранить значение константы типа ValueStorage во внешний файл
if(constans.fbaHranilische!=null){
   	File file = new File(Dao.app.getAppSettings().getCacheDir(),"tmpImg.jpg");
   	boolean complete = constans.fbaHranilische.writeToFile(file);
}

//Сохранить изменения (записать набор констант)
Dao.daoConst.save();

TablePartDao – Менеджер для работы со строками табличной части справочника, документа (создание, удаление, поиск). Данный менеджер может использоваться для доступа к строкам табличной части «напрямую», а не от ссылки на документ.

Содержит метод очистки всех записей по документу tablepartDao.clearTable(Ref owner);  и выборке измененных строк tablepartDao.selectChanged(Ref owner);

TableInfRegDao, TableInfRegPeriodicDao – менеджеры для работы с записями регистров сведений.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
//Выборка всех записей из регистра
List<RegMestaHraneniyaNomenklaturi> lst = Dao.daoRegMestaHraneniyaNomenklaturi.select();
 
//Выборка записей с отбором
HashMap<String, Object> filter = new HashMap<String, Object>();
filter.put(RegAdresniiKlassifikator.FIELD_NAME_NAIMENOVANIE, "Москва");
filter.put(RegAdresniiKlassifikator.FIELD_NAME_SOKRASCHENIE, "г");
List<RegAdresniiKlassifikator> lst = Dao.daoRegAdresniiKlassifikator.select(filter);
 
//Получает значения ресурсов наиболее ранней записи регистра
Date dtBegin = DateHelper.date(2007, Calendar.APRIL, 1);
CatalogValyuti usd  = Dao.daoCatalogValyuti.findByCode("840");
 
HashMap<String, Object> filter = new HashMap<String, Object>();
filter.put(RegKursiValyut.FIELD_NAME_VALYUTA, usd);
RegKursiValyut row = Dao.daoRegKursiValyut.getFirst(dtBegin, filter);
 
//Получает значения ресурсов наиболее поздней записи регистра,
Date dtEnd = DateHelper.date(2007, Calendar.APRIL, 1);
CatalogValyuti usd  = Dao.daoCatalogValyuti.findByDescription("USD");
 
HashMap<String, Object> filter = new HashMap<String, Object>();
filter.put(RegKursiValyut.FIELD_NAME_VALYUTA, usd);
RegKursiValyut row = Dao.daoRegKursiValyut.getLast(dtEnd, filter);
//Выборка всех записей из регистра
List<RegMestaHraneniyaNomenklaturi> lst = Dao.daoRegMestaHraneniyaNomenklaturi.select();

//Выборка записей с отбором
HashMap<String, Object> filter = new HashMap<String, Object>();
filter.put(RegAdresniiKlassifikator.FIELD_NAME_NAIMENOVANIE, "Москва");
filter.put(RegAdresniiKlassifikator.FIELD_NAME_SOKRASCHENIE, "г");
List<RegAdresniiKlassifikator> lst = Dao.daoRegAdresniiKlassifikator.select(filter);

//Получает значения ресурсов наиболее ранней записи регистра
Date dtBegin = DateHelper.date(2007, Calendar.APRIL, 1);
CatalogValyuti usd  = Dao.daoCatalogValyuti.findByCode("840");

HashMap<String, Object> filter = new HashMap<String, Object>();
filter.put(RegKursiValyut.FIELD_NAME_VALYUTA, usd);
RegKursiValyut row = Dao.daoRegKursiValyut.getFirst(dtBegin, filter);

//Получает значения ресурсов наиболее поздней записи регистра,
Date dtEnd = DateHelper.date(2007, Calendar.APRIL, 1);
CatalogValyuti usd  = Dao.daoCatalogValyuti.findByDescription("USD");

HashMap<String, Object> filter = new HashMap<String, Object>();
filter.put(RegKursiValyut.FIELD_NAME_VALYUTA, usd);
RegKursiValyut row = Dao.daoRegKursiValyut.getLast(dtEnd, filter);

TableExDao – менеджер для работы с внешними таблицами.

1
2
3
4
5
6
//Добавление записи в таблицу
ExTableGeoDannie row = Dao.daoExTableGeoDannie.newItem();
row.lat = 45.12345;
row.lng = 37.124;
row.userName = "new user ";
Dao.daoExTableGeoDannie.create(row)
//Добавление записи в таблицу
ExTableGeoDannie row = Dao.daoExTableGeoDannie.newItem();
row.lat = 45.12345;
row.lng = 37.124;
row.userName = "new user ";
Dao.daoExTableGeoDannie.create(row)

Функциональность любого DAO-менеджера можно быть легко расширить добавив в него свои функции.

Похожие записи: